如何使用 result_of 而不是 decltype?
How Can I Use result_of Instead of decltype?
在 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)>;
但是我得到一个编译器错误:
error C2275: 'T': illegal use of this type as an expression
note: see declaration of 'T'
error C2974: 'std::result_of': invalid template argument for '_Fty', type expected
我已经尝试了 result_of
的其他几个输入但没有成功,谁能帮我理解 result_of
在这里期望的参数是什么?
让我们修补一下。 std::result_of
只需要类型,其结果应该从其 type
内部类型定义中检索,并且您需要 typename
才能访问所述类型定义,因为它取决于模板参数。
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<
稍等。我们需要它的 return 类型来表达转换的目标类型。我们又回到了起点。
std::result_of
不能处理重载函数,因为在解决重载之前,函数没有确定的类型。 decltype
是这里唯一的解决方案,因为它 确实 应用重载决议。
如果您想知道 std::result_of
有何用处,考虑到上述限制:它用于重载仿函数,即 class 多次重载 ()
运算符。由于 class 的类型已知,并且不依赖于调用参数,因此 std::result_of
有效。
...但是 std::to_string
不应该总是 return 一个 std::string
??
在 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)>;
但是我得到一个编译器错误:
error C2275: 'T': illegal use of this type as an expression
note: see declaration of 'T'
error C2974: 'std::result_of': invalid template argument for '_Fty', type expected
我已经尝试了 result_of
的其他几个输入但没有成功,谁能帮我理解 result_of
在这里期望的参数是什么?
让我们修补一下。 std::result_of
只需要类型,其结果应该从其 type
内部类型定义中检索,并且您需要 typename
才能访问所述类型定义,因为它取决于模板参数。
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<
稍等。我们需要它的 return 类型来表达转换的目标类型。我们又回到了起点。
std::result_of
不能处理重载函数,因为在解决重载之前,函数没有确定的类型。 decltype
是这里唯一的解决方案,因为它 确实 应用重载决议。
如果您想知道 std::result_of
有何用处,考虑到上述限制:它用于重载仿函数,即 class 多次重载 ()
运算符。由于 class 的类型已知,并且不依赖于调用参数,因此 std::result_of
有效。
...但是 std::to_string
不应该总是 return 一个 std::string
??