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中文网其他相关文章!