鑑於類Foo重構C++模板類
template <typename T>
class Foo
{
public:
...other methods..
void bar()
{
...
m_impl.doSomething();
...
}
void fun()
{
...
m_impl.doSomethingElse();
...
}
void fubar()
{
...
}
private:
T m_impl;
};
我想,以滿足其中T是一個boost :: shared_ptr的情況。 在這種情況下爲類Foo唯一的變化是,它應該調用
m_impl->doSomething();
,而不是
m_impl.doSomething();
我結束了在相同的標題定義FooPtr現在雖然
template <typename T>
class FooPtr
{
public:
...other methods..
void bar()
{
...
m_pImpl->doSomething();
...
}
void fun()
{
...
m_pImpl->doSomethingElse();
...
}
void fubar()
{
...
}
private:
boost::shared_ptr<T> m_pImpl;
};
方法適用於我想用於Foo的所有類, 問題是我有很多重複的代碼,並且有任何更改 我使Foo,我也必須使FooPtr。
我該如何重構代碼?例如。有什麼方法可以在編譯時確定T是否爲boost :: shared_ptr類型,然後專門調用bar和fun方法來調用 - >運算符?
編輯: 感謝迄今爲止所有的答案!我只需要一些時間來解決所有問題,並查看哪種解決方案最適合我們的軟件。
編輯2: @Matthieu:這是我用
class FooImpl
{
public:
void doIt()
{
cout << "A" << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo<FooImpl> foo;
foo.doSomething();
return 0;
}
我只是試圖使用你的方法,但從optional.hpp中得到一個斷言:this-> is_initialized()失敗。我以前從未使用過可選項,並已將測試代碼添加到該問題中。我錯過了什麼? – Ralf 2011-03-16 16:12:03
@Ralf:默認情況下,'boost :: optional'是空的(就像一個空指針),如果你想要一個默認值,你需要在初始化列表中明確地給它賦一個值,例如'impl(T())'構建的對象。 – 2011-03-16 16:16:17
啊,好的,謝謝,這就是訣竅:) – Ralf 2011-03-17 06:31:18