C ++专用模板继承自非专用版本

时间:2010-01-13 20:11:57

标签: c++ inheritance templates

我试图解决问题,但找到了不同的解决方案。 但出于好奇,想知道以下是否可能:

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

我希望能够从专门的struct继承非专用结构。上面的例子不起作用,因为继承的结构是专用的,导致无限递归。

一种可能的解决方案是添加第二个模板参数,比如bool special,这样默认值为false,而专用模板的参数为true。但是,由于实例化需要指定其他参数,因此会使事情变得有点混乱。

还有其他方法可以实现上述目标吗?

最初的问题是实现矩阵矩阵,其中矩阵本身可能有额外的运算符,这取决于组成矩阵是否有那些运算符。我希望这是有道理的。同时,不同的专用矩阵需要具有相同的基类,同时保留相同的名称,尽管具有不同的模板参数。我认为可能有一种方法可以使用enable_if和type traits

来实现

3 个答案:

答案 0 :(得分: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 */ };

答案 1 :(得分:2)

  

一种可能的解决方案是添加第二个模板参数,比如bool special,这样默认值为false,而专用模板的参数为true。但是,由于实例化需要指定其他参数,因此会使事情变得有点混乱。

您可以执行template<class Foo, bool flag = false>,因此第二个参数是可选的。

答案 2 :(得分:0)

我喜欢迈克·西摩(Mike Seymour)的回答,但实际上您不必在所有地方都指定对与错。

您可以有类似这样的内容:

template<class T, bool = false>
class Object {
    void abstract_method();
};

// Now for your derived specialized type do this

template<>
class Object<SpecialObject> : Object<SpecialObject, true> { 
    // override any methods
};

我们只需要将Object模板类bool缺省设置为false,那么当我们实例化Object<SpecialObject>()时,它现在已经为其分配了完整类型,即{ {1}}因此,现在我们要做的就是告诉编译器找到与Object<SpecialObject, false>匹配的潜在不同的特殊化,然后在上面的Object<SpecialObject, true>之后进行。

现在,编译器将选择其中带有:的类,即使默认将其设置为false,我们也已经选择了abstract_method的特殊化,因为在编译器首次遇到该默认参数时类型falseObject<SpecialObject>确实相同,所以现在当我们传递Object<SpecialObject, false>时,我们明确地说我不在乎谁使用了默认true参数现在尝试使用false查找其他专业化项目,并且可以使用。