C++ CRTP 类层次结构 [英] C++ CRTP class hierarchy

查看:40
本文介绍了C++ CRTP 类层次结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

来自维基百科:

// The Curiously Recurring Template Pattern (CRTP)
template <typename T>
struct base
{
    // ...
};
struct derived : base<derived>
{
    // ...
};

现在如果我想要derived_from_derived,我可以写:

Now if I want derived_from_derived, I can write:

// The Curiously Recurring Template Pattern (CRTP)
template <typename T>
struct base
{
    // ...
};
template <typename T>
struct derived : base<T>
{
    // ...
};
struct derived_from_derived : derived <derived_from_derived>
{
    // ...
};

现在假设我只想要一个 derived 对象.这不起作用:

Now suppose I just want a derived object. This doesn't work:

derived<derived> obj;

derived 是否必须是抽象的,或者有没有办法实例化它?

Does derived have to be abstract, or is there a way to instantiate it?

推荐答案

我自己的答案是这样的:

My own answer is this:

struct base
{
    template <typename T>
    struct type
    {
        // ...
    };
};
struct derived
{
    template <typename T=derived>
    struct type : base::type<T>
    {
        // ...
    };
}
struct derived_from_derived 
{
    template <typename T=derived_from_derived >
    struct type : derived::type<T>
    {
        // ...
    };
};

现在我可以有一个 derived::type<>对象.此外,参数化继承也有效(例如装饰器模式):

Now I can have a derived::type<> obj. Also, parametized inheritance works (e.g. decorator pattern):

template <typename whatever>
struct derived_from_whatever 
{
    template <typename T=derived_from_whatever>
    struct type : whatever::type<T>
    {
        // ...
    };
};

derived_from_whatever<derived_from_derived>::type<> obj_whatever;

这篇关于C++ CRTP 类层次结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆