解决CRTP初始化顺序

时间:2019-10-17 13:40:58

标签: c++ templates crtp

我有一些CRTP依赖项,不确定如何解决。理想情况下,我想在基类中放置尽可能多的内容,例如函数,因此我不必为每个继承它们的类重新定义它们。这似乎导致初始化顺序出现问题,其中result_type取决于尚未初始化的类型。这是一个示例:https://godbolt.org/z/YpfcPB

这是代码:

template<typename T>
struct CRTP_Derived;

template<typename Derived>
struct CRTP
{
    using result_type = typename Derived::result_type;

};

template<typename T>
struct CRTP_Derived : public CRTP<CRTP_Derived<T>>
{
    using result_type = T;
};

int main()
{
    CRTP_Derived<int> a;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

对于这样的问题,我还使用了单独的特征类型。如果将特征作为第二个模板参数,则可以稍微减少所需的样板,而不是要求用户专门设置单独的模板:

template<typename Derived, typename Traits>
struct CRTP
{
    using result_type = typename Traits::result_type;
};

template<typename T>
struct CRTP_Derived_Traits
{
    using result_type = T;
};

template<typename T>
struct CRTP_Derived : public CRTP<CRTP_Derived<T>, CRTP_Derived_Traits<T>>
{
};

int main()
{
    CRTP_Derived<int> a;
    return 0;
}

答案 1 :(得分:0)

我发现一种解决方法是在单独的类中删除typedef,但仍然很高兴看到其他解决方案。 https://godbolt.org/z/a7NCE2

template<typename T>
struct CRTP_Derived;

template<typename Derived>
struct traits;

template<typename T>
struct traits<CRTP_Derived<T>>
{
    using result_type = T;
};

template<typename Derived>
struct CRTP
{
    using result_type = typename traits<Derived>::result_type;
};

template<typename T>
struct CRTP_Derived : public CRTP<CRTP_Derived<T>>
{
    using result_type = T;
};

int main()
{
    CRTP_Derived<int> a;
    return 0;
}