2

这个答案中,我创建了一个类型特征:

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这里期待什么论点?

4

1 回答 1

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 中,您可以删除::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<

坚持,稍等。我们需要它的返回类型来表达转换的目标类型。我们又回到了起点。

std::result_of无法处理重载函数,因为在重载解决之前,函数没有确定的类型。decltype是这里唯一的解决方案,因为它确实应用了重载决议。

如果您想知道如何std::result_of使用,鉴于上述限制:它用于重载仿函数,即()多次重载运算符的类。由于类的类型是已知的,并且不依赖于调用参数,因此std::result_of有效。

...但不应该std::to_string总是返回一个std::string??

于 2015-06-02T12:08:18.070 回答