在此答案中,我根据类型的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();}
3 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
使用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,
void_t<decltype(std::to_string(std::declval<T>()))>
>
: std::true_type { };
- 3 回答
- 0 关注
- 413 浏览
添加回答
举报
0/150
提交
取消