使用派生的模板参数类型作为函数的返回类型(CRTP)?

时间:2017-11-17 07:05:47

标签: c++ templates crtp

我在下面的代码中重新创建了我遇到的问题:

template<typename T>
class A{
    using type = T::type;
    type someFunction(/*some parameters*/){/*code for the function*/}
    //other stuff
};

template<typename T>
class B : public A<B<T>>{
    typedef T type;
    //other stuff
};

问题是我需要A有一个返回类型为T::type的函数,但由于在编译A时没有完全声明B,我得到错误{{1}当我尝试编译它时(其中int可以替换为任何其他类型)。有没有办法让这个工作?

2 个答案:

答案 0 :(得分:3)

如果将function dmp( $value ) { echo $value ; } 的定义移到外部特征类,则可以实现它:

B<T>::type

答案 1 :(得分:1)

  

有什么方法可以让它发挥作用吗?

您可以使用traits类派生类型,而不是使用:

using type = T::type;

示例:

// Declare TypeSelector
template <typename T> struct TypeSelector;

template <typename T>
class A
{
    using type = typename TypeSelector<T>::type;
    type someFunction(/*some parameters*/){ return type {}; }
};

// Declare B.
template <typename T> class B;

// Define TypeSelector for <B<T>> first before defining B<T>
template <typename T> struct TypeSelector<B<T>>
{
    using type = T;
};

template<typename T>
class B : public A<B<T>>{
    using type = typename TypeSelector<T>::type;
    //other stuff
};

int main()
{
   // Compiles fine.
   B<int> a;
}