通过-int()
确定double()*double()
或result_of
的结果的正确语法是什么?
这失败
std::result_of<operator-(int)>::type
std::result_of<operator*(double,double)>::type
答案 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>
例如,要获得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