奇怪的重复模板模式 (CRTP) 允许 C 中的静态多态性,但当旨在根据派生类型修改函数返回类型。虽然 CRTP 通常可以推断派生类型,但以下代码在 MSVC 2010 中遇到编译问题:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; };
出现此错误的原因是派生类在基类中用作基类的模板参数时不完整班级名单。为了解决这个问题,一个常见的解决方法是使用特征类模板:
// Declare the base_traits class template template <typename derived_t> struct base_traits; // Define the base class template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; }; // Define the derived class template <typename T> struct derived : public base<derived<T>> { typedef typename base_traits<derived<T>>::value_type value_type; }; // Specialization of base_traits for derived template <typename T> struct base_traits<derived<T>> { typedef T value_type; };
通过将 base_traits 模板专门化为所需的派生类型,您可以定义所需的成员,包括 foo 等函数的自定义返回类型()。该技术使静态多态性在返回类型上具有更大的灵活性,同时避免编译错误。
以上是如何通过 C 静态多态性 (CRTP) 实现灵活的返回类型并避免编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!