这与我提出的另一个问题类似,但是,我已经创建了一个类似的表达式类:
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并接受两个参数的函数。
答案 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);