元编程:作为单独函数定义的 C 函数定义失败
在 C 中,可以根据类型特征定义元函数。例如,可以定义一个模板,根据值的类型是否为算术类型将值转换为字符串:
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){ return to_string(t); } template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){ return static_cast<ostringstream&>(ostringstream() << t).str(); }
但是,这种方法依赖于该类型的 is_arithmetic 属性。更理想的方法是基于该类型的 std::to_string 函数的可用性。然而,将以下要求表达为类型特征是具有挑战性的:
“如果为该类型定义了 std::to_string,则使用它。”
可以声明 std 的条件::to_string 可用性:
template<typename T> decltype(to_string(T{})) stringify(T t){ return to_string(t); }
但尚不清楚如何构造相反的
使用 Walter Brown 的 void_t 类型特征,可以轻松定义所需的类型特征:
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 函数,允许根据功能可用性进行更灵活的模板选择。
以上是如何在 C 中定义函数可用性的类型特征?的详细内容。更多信息请关注PHP中文网其他相关文章!