我计划了这个可爱的小装置(嗯,我认为它很甜):
template< typename T>
class CInterfaceT
{
//a purely virtual interface declaration
};
template< typename T, typename SomeOtherStuff >
class CImplementationT : public CInterfaceT<T>
{
//implemenation stuff
};
然后:
typedef CInterfaceT<CFoo> IFooInterface;
typedef CInterface<CBar> IBarInterface;
class CObnoxiousHolder
{
public:
IFooInterface* GetFoo() { return &m_Foo; }
IBarInterface* GetBar() { return &m_Bar; }
private:
CImplementationT <CFoo, someting> m_Foo;
CImplementationT <CBar, otherting> m_Bar;
};
问题是,那些typedefed“接口”必须在C ++ CLI项目中使用,该项目依赖于以下内容来导入非托管代码:
class IFooInterface;
typedef IFooInterface CFooCppInterface;
显然,这是有效的。或者曾经使用正确声明的接口类,现在不能正常工作,因为你无法向前声明模板实例。
膝盖反射解决方案是声明一些适当的接口类而不是typedef:
class IFooInterface : public CInterfaceT<CFoo> {};
class IBarInterface : public CInterfaceT<CBar> {};
但这搞砸了GetFoo() - 类似的getter方法,因为这些新接口现在与正确的实现类几乎没有关系。
我仍然非常喜欢这里的模板方法,因为它节省了相当多的样板。我该如何解决?
编辑:解决方案很简单:使用更多模板!
template< typename T, typename Q, typename SomeOtherStuff >
class CImplementationT : public Q
{
//implemenation stuff
};
答案 0 :(得分:0)
只是一个猜测 - 你需要这样的东西吗?
template<> class CInterfaceT<CFoo>;
typedef CInterfaceT<CFoo> CFooCppInterface;
而不是;
class IFooInterface;
typedef IFooInterface CFooCppInterface;
部分专业的模板无法向前声明。
答案 1 :(得分:0)
编辑后,基本上 - 我在实现模板接口而不是正确的接口时使用静态多态。