C++类模板中如何避免重复定义超类参数化与value_type类型?
避免重复书写复杂类型的几种方案
当然有办法避免重复写那段冗长的类型声明,下面给你几个实用的方案:
方案1:类内定义局部别名(C++11及以上)
先把std::remove_reference<Iterator>::type提取成类内的私有别名,再基于它定义value_type。如果用C++17及以上,还可以用std::remove_reference_t简化typename std::remove_reference<Iterator>::type的书写:
#include <type_traits> template <typename Iterator> class Class: public Superclass<std::remove_reference_t<Iterator>::value_type> { private: // 提取去引用后的迭代器类型作为局部别名 using iterator_type = std::remove_reference_t<Iterator>; public: // 基于局部别名定义value_type,避免重复书写长串 using value_type = typename iterator_type::value_type; explicit Class(Iterator&& iterator); protected: Iterator iterator; };
如果是C++11/14环境,把std::remove_reference_t<Iterator>替换成typename std::remove_reference<Iterator>::type即可。
方案2:提取全局模板别名(C++11及以上)
如果这个类型需要在多个类或模块中复用,可以把它提取成独立的全局模板别名:
#include <type_traits> // 全局定义类型萃取的模板别名 template <typename Iterator> using IteratorValueType = typename std::remove_reference<Iterator>::type::value_type; template <typename Iterator> class Class: public Superclass<IteratorValueType<Iterator>> { public: using value_type = IteratorValueType<Iterator>; explicit Class(Iterator&& iterator); protected: Iterator iterator; };
方案3:基类萃取(进阶复用)
如果你的代码里有多个类似的迭代器包装类,可以定义一个专门的基类来统一处理类型萃取,避免每个类重复写逻辑:
#include <type_traits> template <typename Iterator> class IteratorWrapperBase { protected: using iterator_type = typename std::remove_reference<Iterator>::type; using value_type = typename iterator_type::value_type; }; template <typename Iterator> class Class: public IteratorWrapperBase<Iterator>, public Superclass<typename IteratorWrapperBase<Iterator>::value_type> { public: explicit Class(Iterator&& iterator); protected: Iterator iterator; };
后续其他包装类也可以直接复用IteratorWrapperBase来获取相关类型。
内容的提问来源于stack exchange,提问作者Charlie Vanaret - the Uno guy
相关产品推荐
相关产品推荐

