如何使用 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 中,您可以删除 ::typetypename

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 ??