首页 > 后端开发 > C++ > C Traits 如何解决奇怪的重复模板模式中静态多态性和 Typedef 的编译问题?

C Traits 如何解决奇怪的重复模板模式中静态多态性和 Typedef 的编译问题?

Mary-Kate Olsen
发布: 2024-12-11 01:51:09
原创
231 人浏览过

How Can C   Traits Solve Compilation Issues with Static Polymorphism and Typedefs in the Curiously Recurring Template Pattern?

C 中的静态多态性和 Typedef

奇怪的循环模板模式 (CRTP) 是 C 中实现静态多态性的一种技术。但是,当尝试推广此模式以根据派生类型修改返回类型时,代码可能无法编译,就像使用 MSVC 2010 的用户所遇到的那样。

问题:

以下代码旨在允许派生类中使用不同的返回类型,但无法编译:

template <typename derived_t>
class base {
public:
    typedef typename derived_t::value_type value_type;
    value_type foo() {
        return static_cast<derived_t*>(this)->foo();
    }
};

template <typename T>
class derived : public base<derived<T>> {
public:
    typedef T value_type;
    value_type foo() {
        return T();
    }
};
登录后复制

错误遇到的是“不是‘派生’的成员。”出现这种情况是因为派生类型在用作其基类的模板参数时不完整。

使用 Traits 的解决方案:

常见的解决方法是使用特征类模板。在此方法中,定义了一个 base_traits 类模板来封装派生类中的类型和函数。修改原始基类以使用这些特征。

template <typename derived_t>
struct base_traits;

template <typename derived_t>
struct base {
    typedef typename base_traits<derived_t>::value_type value_type;
    value_type base_foo() {
        return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this));
    }
};

template <typename T>
struct derived : base<derived<T>> {
    typedef typename base_traits<derived>::value_type value_type;
    value_type derived_foo() {
        return value_type();
    }
};

template <typename T>
struct base_traits<derived<T>> {
    typedef T value_type;
    static value_type call_foo(derived<T>* x) {
        return x->derived_foo();
    }
};
登录后复制

通过为派生模板参数中使用的每种类型专门化 base_traits 类,可以通过特征访问所需的类型和函数,从而启用静态多态性和动态返回类型。

以上是C Traits 如何解决奇怪的重复模板模式中静态多态性和 Typedef 的编译问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板