从非专业版本继承C++专业模板
问题描述:
我试图解决一个问题,但发现了一个不同的解决方案。然而 出于好奇想知道,如果以下是可能的:从非专业版本继承C++专业模板
template<class> struct S;
template< > struct S<Foo> : struct<Foo> {};
我希望能够继承非专业化结构从上面的专业例如struct.the不起作用,因为继承的结构是专业的,领先到无限递归。
一个可能的解决方案是添加第二个模板参数,比如说bool专用的,这样默认值为false,专用模板具有该参数为true。但是由于实例化需要指定附加参数,所以事情有点麻烦。
有没有其他的方法来实现上述?
最初的问题是实现矩阵的矩阵,其中矩阵本身可能有额外的运算符,这取决于组成矩阵是否具有这些运算符。我希望这是有道理的。同时不同的专用矩阵需要保持相同的名称,但具有不同的模板参数的同一基础类。我曾经想过可能有办法做到这一点使用enable_if和型性状
答
一个可行的办法是添加第二个模板参数,说BOOL专业化,使得默认是假的,和专业的模板有参数true,但由于实例化需要指定附加参数,所以这使事情有点麻烦。
你可以做template<class Foo, bool flag = false>
,所以第二个参数是可选的。
答
你可以保持在一个单独的类型的所有通用的东西,并延长与您的专业:
template <typename> struct S_generic { /* generic stuff here */ };
template <typename T> struct S : public S_generic<T> { /* nothing here */ };
template <> struct S<Foo> : public S_generic<Foo> { /* extra stuff here */ };
编辑:另外,如果你不喜欢多余的名字,顺便用在实例化模板时没有混乱的额外标志是使用默认值:
template <typename T, bool fully_defined=true> struct S;
template <typename T> struct S<T,false> { /* generic stuff here */ };
template <typename T> struct S<T,true> : public S<T,false> {};
template <> struct S<Foo,true> : public S<Foo,false> { /* extra stuff here */ };
第一个反问题是你想用这个解决什么样的问题? – 2010-01-13 20:15:31