元编程:基于重载解析的专业化
在元编程中,基于类型属性定义模板是很常见的。然而,当尝试根据是否为给定类型定义特定重载来在两个模板定义之间进行选择时,就会出现挑战。
Walter Brown 引入了一个有用的类型 void_t,如果没有提供模板参数,它会返回 void 。基于这个概念,我们可以定义一个类型特征来检查给定类型的 std::to_string 重载是否存在:
template<typename T, typename = void> struct has_to_string : std::false_type { }; template<typename T> struct has_to_string<T, void_t<decltype(std::to_string(std::declval<T>()))>> : std::true_type { };
有了这个类型特征,我们现在可以轻松编写一个模板专门基于 std::to_string:
template<typename T> enable_if_t<has_to_string<T>::value, string> stringify(T t){ return std::to_string(t); } template<typename T> enable_if_t<!has_to_string<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
以上是如何根据重载解析来专门化模板?的详细内容。更多信息请关注PHP中文网其他相关文章!