Дан класс Foo
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 для вызова оператора ->?
Edit:
Спасибо за все ответы до сих пор! Мне просто нужно время, чтобы обойти их все и выяснить, какое решение лучше всего подходит для нашего программного обеспечения.
Редактировать 2:
@Matthieu: это тестовый код, который я использовал
class FooImpl
{
public:
void doIt()
{
cout << "A" << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo<FooImpl> foo;
foo.doSomething();
return 0;
}