C++ 选择要从中派生的CRTP基类
假设我有以下非常简单的CRTP基类:C++ 选择要从中派生的CRTP基类,c++,templates,crtp,static-polymorphism,C++,Templates,Crtp,Static Polymorphism,假设我有以下非常简单的CRTP基类: template< class D, class T > struct Base { T foo() { return static_cast< D* >(this)->foo_i(); } }; 我想做的基本上是向这个类添加一个额外的模板参数,以便在编译时选择是从Base派生(如果我想要模拟的“动态”绑定)还是从VirtualBase派生(如果我想要真正的动态绑定)。类似于
template< class D, class T >
struct Base
{
T foo()
{
return static_cast< D* >(this)->foo_i();
}
};
我想做的基本上是向这个类添加一个额外的模板参数,以便在编译时选择是从Base派生(如果我想要模拟的“动态”绑定)还是从VirtualBase派生(如果我想要真正的动态绑定)。类似于以下伪C++:
template< class B, class T >
struct DerivedB : public B< DerivedB< T >, T >
{
T foo_i()
{
std::cout << "I'm special!\n";
return T();
}
};
模板
struct-DerivedB:public B,T>
{
T foo_i()
{
std::cout最简单的方法可能只是添加“classd”作为VirtualBase的一个未使用的模板参数,以便它符合相同的接口
如果无法更改VirtualBase,则可以使用中间模板:
template <class D, class T> class VirtualBaseWrapper : public VirtualBase<T>{}
模板类VirtualBaseWrapper:公共VirtualBase{}
template< class B, class T >
struct DerivedB : public B< DerivedB< T >, T >
{
T foo_i()
{
std::cout << "I'm special!\n";
return T();
}
};
template <class D, class T> class VirtualBaseWrapper : public VirtualBase<T>{}