std :: result_of用于内置运算符

时间:2014-12-16 18:06:46

标签: c++ c++11 typetraits

通过-int()确定double()*double()result_of的结果的正确语法是什么?

这失败

std::result_of<operator-(int)>::type
std::result_of<operator*(double,double)>::type

2 个答案:

答案 0 :(得分:8)

std::result_of真的不是这里采取的方法。 decltype完全符合您的要求,可以用作decltype(-int())decltype(double()*double())等。如果您不知道该类型是否可以默认构建,您还可以使用{{1} }:std::declval

任何涉及decltype(-std::declval<int>())的语法都不起作用的原因是因为operator-语法仅适用于自定义重载运算符。内置操作符没有任何可以参考的后台功能。

答案 1 :(得分:3)

decltype绝对是您的理由,但如果您必须使用result_of,则可以使用<functional>

中定义的function objects来完成

例如,要获得double * double的结果类型,请使用

std::result_of<std::multiplies<double>(double, double)>::type

同样,一元否定将是

std::result_of<std::negate<int>(int)>::type

使用C ++ 14,您甚至可以在两种不同类型上查询数学运算的结果类型

std::result_of<std::plus<>(double, int)>::type

当然,同样的技术也可以用于用户定义的类型

struct foo{};
struct bar{};
bar operator/(foo, foo) { return bar{}; }

std::result_of<std::divides<>(foo, foo)>::type

Live demo