首页 >后端开发 >C++ >C 中的 CRTP 如何处理派生类的 Typedef 以实现静态多态性?

C 中的 CRTP 如何处理派生类的 Typedef 以实现静态多态性?

DDD
DDD原创
2024-12-10 09:42:18943浏览

How Can CRTP in C   Handle Typedefs from Derived Classes for Static Polymorphism?

带有来自派生类的 Typedef 的 C 静态多态性 (CRTP)

在静态多态性(也称为编译时多态性)中,派生类在编译时对于基类来说是已知的。这可以使用奇怪的重复模板模式(CRTP)来实现。但是,您可能希望根据派生类型自定义函数的返回类型。

请考虑以下代码:

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(); //return some T object (assumes T is default constructable)
    }
};

但是,由于使用了以下代码,此代码可能无法编译来自基类模板内的派生类的类型别名 value_type。错误在于,当用作基的模板参数时,派生是不完整的。

一种解决方案是使用特征类模板。下面是一个修改后的示例:

// Declare a base_traits traits class template:
template <typename derived_t> 
struct base_traits;

// Define the base class that uses the 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));
    }
};

// Define the derived class; it can use the traits too:
template <typename T>
struct derived : base<derived<T>> { 
    typedef typename base_traits<derived>::value_type value_type;

    value_type derived_foo() { 
        return value_type(); 
    }
};

// Declare and define a base_traits specialization for derived:
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,您可以提供基类模板所需的必要成员(value_type 和 call_foo)。这允许您从基类模板内的派生类访问 typedef 和函数,从而通过自定义返回类型实现静态多态性。

以上是C 中的 CRTP 如何处理派生类的 Typedef 以实现静态多态性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn