让我们修补一下。std::result_of
只需要类型,其结果应该从其type
内部 typedef 中检索,并且您需要typename
访问所述 typedef,因为它依赖于模板参数。
template<typename T>
using to_string_t = typename std::result_of<decltype(std::to_string)(T)>::type;
^^^^^^^^ ^^^^^^^^ ^^^^^^
或者在 C++14 中,您可以删除::type
和typename
:
template<typename T>
using to_string_t = std::result_of_t<decltype(std::to_string)(T)>;
^^
美好的 ?
main.cpp:5:68: error: decltype cannot resolve address of overloaded function
是的,std::to_string
是重载的,所以我们需要通过将它转换为它的一个重载来消除歧义。
template<typename T>
using to_string_t = typename std::result_of<decltype(static_cast<
坚持,稍等。我们需要它的返回类型来表达转换的目标类型。我们又回到了起点。
std::result_of
无法处理重载函数,因为在重载解决之前,函数没有确定的类型。decltype
是这里唯一的解决方案,因为它确实应用了重载决议。
如果您想知道如何std::result_of
使用,鉴于上述限制:它用于重载仿函数,即()
多次重载运算符的类。由于类的类型是已知的,并且不依赖于调用参数,因此std::result_of
有效。
...但不应该std::to_string
总是返回一个std::string
??