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

Changing type signature of base class member based on inheriting class template

本文关键字:成员 基类 类型 于继承 继承      更新时间:2023-10-16

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

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<float>中没有名为‘tt’的类型"(当我用tt作为float实例化B时)。

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

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

在实例化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();
};

演示。