在this answer中,我创建了一个类型特征:
template<typename T>
using to_string_t = decltype(to_string(declval<T>()));
这个工作得很好,但我最初开始使用result_of
,现在它让我觉得无法理解如何去做。
我正在尝试用以下内容替换上面的行:
template<typename T>
using to_string_t = result_of<to_string(T)>;
但是我得到了一个编译错误:
错误C2275:'T':非法使用此类型作为表达式
注意:见“T”的声明 错误C2974:'std :: result_of':'_Fty'的模板参数无效,预期类型
我已经尝试了result_of
的其他几个输入但没有成功,任何人都可以帮助我理解result_of
期望的参数吗?
答案 0 :(得分:8)
让我们修补它。 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
??