基于继承类模板更改基类成员的类型签名

时间:2015-02-18 06:47:15

标签: c++ templates inheritance crtp

我有两个类,一个继承自另一个类:

struct A {
    (pure?) virtual tt returns_something();
}

template <typename T>
struct B : A {
    virtual T returns_something();
}

如何使这项工作,returns_something()具有正确的类型签名。

我认为这是一个奇怪的重复出现的模板模式的工作:

template <typename T>
struct A {
    pure virtual typename T::tt returns_something();
}
template <typename TT>
struct B : A<B<TT>> {
    typedef TT tt;
    virtual tt returns_something();
}

然而,这似乎抱怨说&#34;没有名为&#39; tt&#39;在B&lt;漂浮&gt;&#34; (当我用TT作为浮动实例化B时)。

有什么想法吗?在这种情况下,这是正确的方法吗?还有其他方法更适合吗?

注意:这是一种简化的情况。同一类型A上的模板B仅仅是因为A有很多模板参数,我不想这样做。

1 个答案:

答案 0 :(得分:2)

在实例化A<B<TT>>时,B<TT>仍然是一个不完整的类,因此您无法使用B<TT>::tt

如果有争议的类型是B的模板参数,那么您可以通过traits类提取模板参数:

template <typename TT>
struct B;

template<class> struct B_traits;
template<class TT> 
struct B_traits<B<TT>> {
    using tt = TT;
};

template <typename T>
struct A {
   virtual typename B_traits<T>::tt returns_something();
};

Demo