我如何使用result_of而不是decltype?

时间:2015-06-02 11:43:30

标签: c++ typetraits overloading decltype result-of

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期望的参数吗?

1 个答案:

答案 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中,您可以放弃::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 ??