元编程:函数定义失败定义了单独的函数

在此答案中,我根据类型的is_arithmetic属性定义一个模板:


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();

}

dyp建议,is_arithmetic是否to_string为类型定义而不是类型的属性作为模板选择标准。这显然是可取的,但我不知道一种说法:


如果std::to_string未定义,则使用ostringstream重载。


声明to_string条件很简单:


template<typename T> decltype(to_string(T{})) stringify(T t){

    return to_string(t);

}

与我无法弄清楚如何构造的标准相反。这显然行不通,但希望它能传达我正在尝试构造的内容:


template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){

    return static_cast<ostringstream&>(ostringstream() << t).str();

}


RISEBY
浏览 414回答 3
3回答

红颜莎娜

使用Walter Brown的void_t:template <typename...>using void_t = void;制作这样的类型特征非常容易:template<typename T, typename = void>struct has_to_string: std::false_type { };template<typename T>struct has_to_string<T,&nbsp;&nbsp; &nbsp; void_t<decltype(std::to_string(std::declval<T>()))>&nbsp; &nbsp; >&nbsp;: std::true_type { };
打开App,查看更多内容
随时随地看视频慕课网APP