首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析CRTP初始化顺序

解析CRTP初始化顺序
EN

Stack Overflow用户
提问于 2019-10-17 21:40:58
回答 2查看 68关注 0票数 3

我有一些CRTP依赖,我不确定如何解决。理想情况下,我希望在基类中放入尽可能多的东西,比如函数,这样我就不必为继承这些函数的每个类重新定义这些函数。这似乎导致了初始化顺序的问题,在初始化顺序中,result_type依赖于尚未初始化的类型。下面是一个示例:https://godbolt.org/z/YpfcPB

下面是代码:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2019-10-17 22:24:43

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-10-17 22:14:25

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

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58434088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档