运营商可以用作功能吗? (C ++)

时间:2009-06-14 06:51:58

标签: c++ operator-overloading function-pointers

这与我提出的另一个问题类似,但是,我已经创建了一个类似的表达式类:

expression<int, int> exp(10, 11, GreaterThan);
//expression<typename T, typename U> exp(T val1, U val2, oper op);
//where oper is a pointer to bool function(T, U)

其中GreaterThan是先前定义的函数。我想知道为什么我不能这样做:

expression<int, int> exp(10, 11, >);

特别是当&gt;

重载
bool operator>(int a, int a){return (a > b);}

与GreaterThan相同:

bool GreaterThan(int a, int b){return (a > b);}

返回bool并接受两个参数的函数。

5 个答案:

答案 0 :(得分:9)

我不确定这是不是你要问的,但是C ++标准库为许多C ++的运算符提供了函数对象,在标题<functional>中声明。其中包括std::plus(+),std::minus( - ),std::multiplies(*),std::divides(/),std::modulus(%),{{1 }}(一元 - ),std::negate(==),std::equal_to(!=),std::not_equal_to(&lt;),std::less(&gt;),{{1 }(&lt; =),std::greater(&gt; =),std::less_equal(&amp;&amp;),std::greater_equal(||),std::logical_and(!)< / p>

所以也许你只想要

std::logical_or

答案 1 :(得分:6)

而不是:

expression<int, int> exp(10, 11, >);

你可以这样做:

expression<int, int> exp(10, 11, operator>);

可能因为它不适用于整数。但它适用于您将超载的其他类型或操作员
你重载的运算符是普通函数,所以实际上你正在使用函数指针。

答案 2 :(得分:3)

您不能写下以下内容:

bool operator>(int a, int a){return (a > b);}

C ++不允许为内置类型重载运算符。请重新编写您的问题,特别是给出表达式模板的实际代码。

答案 3 :(得分:2)

Neil是对的,这不适用于内置类型。至少有一个参数必须是“正式类型”。另一个问题是

expression<int, int> exp(10, 11, >);

不是编译器喜欢你写的。相反,您可以使用类似下面的代码

class A
{

};
class B
{

};
typedef bool (*oper)(A& a, B& b);
bool operator>(A& a, B& b)
{
  return false;

}
bool func(A&a, B& b, oper op)
{

}

然后在你的代码中

  A a;
  B b;
  func(a, b, operator>);

答案 4 :(得分:-1)

例如+运算符的类型为

int (__thiscall Integer::*)(int value)

用于操作员功能

int Integer::operator + (int i)

要传递操作员功能,您只需执行以下操作:

Integer a(10), b(20);
add(a, b, &Integer::operator +);

要使用它,请执行以下操作:

(a.*functionPtr)(b);