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

标签 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();
}

但是,这似乎是在提示“B 中没有名为‘tt’的类型”(当我用 TT 作为 float 实例化 B 时)。

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

注意:这是一个简化的情况。在同一类型 B 上对 A 进行模板化只会让 A 有很多模板参数,我不希望这样。

最佳答案

当时A<B<TT>>被实例化,B<TT>仍然是一个不完整的类,所以你不能使用 B<TT>::tt .

如果问题类型是 B 的模板参数,然后您可以通过特征类提取模板参数:

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 .

关于c++ - 基于继承类模板更改基类成员的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28577609/

相关文章:

c++ - move 构造函数的问题

c++ - std::enable_if 的模糊部分特化

c++ - boost 功能模板错误

c# - 继承具有不同泛型参数的泛型接口(interface)

c++ - C++中的向上转型和向下转型

c++ - 从类模板继承模板化构造函数?

c++ - 我可以注册一个根据定义其类型的字符串调用特定模板函数的函数吗?

python - Python中的简单类继承

java - 在 Java EE 中使用静态对象

c++ - 将 C 函数指针分配给成员函数