std::result_of 用于内置运算符

std::result_of for built-in operators

本文关键字:内置 运算符 用于 result std of      更新时间:2023-10-16

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

此操作失败

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

std::result_of真的不是这里要采取的方法。 decltype完全可以做你想要的,可以用作decltype(-int())decltype(double()*double())等。如果您不知道该类型是否为默认构造型,也可以使用 std::declvaldecltype(-std::declval<int>())

任何涉及operator-的语法都不起作用的原因是,operator-语法仅适用于自定义重载运算符。内置运算符没有任何可以引用的支持函数。

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

现场演示