2010-01-13 89 views
7

我试图解决一个问题,但发现了一个不同的解决方案。然而 出于好奇想知道,如果以下是可能的:从非专业版本继承C++专业模板

template<class> struct S; 
template< > struct S<Foo> : struct<Foo> {}; 

我希望能够继承非专业化结构从上面的专业例如struct.the不起作用,因为继承的结构是专业的,领先到无限递归。

一个可能的解决方案是添加第二个模板参数,比如说bool专用的,这样默认值为false,专用模板具有该参数为true。但是由于实例化需要指定附加参数,所以事情有点麻烦。

有没有其他的方法来实现上述?

最初的问题是实现矩阵的矩阵,其中矩阵本身可能有额外的运算符,这取决于组成矩阵是否具有这些运算符。我希望这是有道理的。同时不同的专用矩阵需要保持相同的名称,但具有不同的模板参数的同一基础类。我曾经想过可能有办法做到这一点使用enable_if和型性状

+3

第一个反问题是你想用这个解决什么样的问题? – 2010-01-13 20:15:31

回答

2

一个可行的办法是添加第二个模板参数,说BOOL专业化,使得默认是假的,和专业的模板有参数true,但由于实例化需要指定附加参数,所以这使事情有点麻烦。

你可以做template<class Foo, bool flag = false>,所以第二个参数是可选的。

5

你可以保持在一个单独的类型的所有通用的东西,并延长与您的专业:

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 */ }; 
+0

这就是我最终做的。我试图避免的是有两个不同的名字。我认为可能有一种方法可以使用enable_if和type特征来实现它。 – Anycorn 2010-01-13 20:31:21

+0

没有理由添加enable_if或type特征的所有额外复杂功能,只需使用非专业化和专业化可以继承的通用基础。 'BlahBase'或'blah_base'很常见。 – 2010-01-13 20:50:06

+0

在这一点上,它并不是很实际的问题,因为好奇心问题,“我想知道它是否可以做到这一点?”。 – Anycorn 2010-01-13 20:57:41