我认为函数的定义就像分配给左边部分一样。 int f(int x)包含大括号id est:{... code ...}之间代码的右边部分。
所以我想将已定义函数的地址分配给重载运算符。 我没有立即定义重载运算符,因为定义的函数(在现实生活中)是一个模板函数,取决于布尔参数。
我希望能够编译的代码示例如下。 这有可能吗? (没有将重载的运算符定义为对函数的单个语句调用)
struct CNT{
int c;
};
CNT addCNT(CNT a,CNT b){
CNT r;
r.c = (a.c<=b.c) ? a.c : b.c ;
return r;
}
// CNT operator+(CNT a,CNT b){addCNT(a,b);}
CNT operator+(CNT,CNT)=&addCNT;
int main(int argc, char **argv)
{
CNT a(10),b(20),c;
c=a+b;
}
答案 0 :(得分:1)
重载的运算符+只是一个函数名。
但是,你想要做的是:
CNT operator+(CNT,CNT)=&addCNT;
[无效]等同于分配函数指针
我修复了编译错误并添加了一个指针:
struct CNT {
CNT(int x) { c = x; };
CNT() { CNT(0); };
int c;
};
CNT (*addCNTptr)(CNT a,CNT b);
CNT addCNT(CNT a,CNT b)
{
CNT r;
r.c = (a.c<=b.c) ? a.c : b.c ;
return r;
}
CNT operator+(CNT a,CNT b){ return addCNTptr(a,b); }
//CNT operator+(CNT,CNT)=&addCNT;
int
main(int argc, char **argv)
{
addCNTptr = addCNT;
CNT a(10),b(20),c;
c=a+b;
return c.c;
}
答案 1 :(得分:1)
在C ++中无法实现您想要的功能。语言规则根本不允许。
如果您希望拨打operator+()
(或a+b
之类的表达式)来解析对addCNT()
的呼叫,则需要定义operator+()
以便其身体确实如此电话。
答案 2 :(得分:0)
首先,让我们不要考虑运算符,在C ++中,函数指针定义如下:
CNT (*addThem)(CNT, CNT) = &addCNT;
然后,您可以这样称呼它:
addThem(arg1, arg2);
但是,您尝试做的事情(再次忘记运算符)是函数声明-ish语句:
CNT addThem+(CNT,CNT)=&addCNT;
这不是有效的C ++,也不会编译。我知道的唯一这样的语法有效的地方是声明一个虚函数abstract:
virtual void f() = 0;
但是,还有另一个步骤。您尝试对operator+
执行相同的操作。现在您知道无法为函数声明分配函数指针,您可能希望这样做:
CNT (*operator+)(CNT, CNT) = &addCNT;
但在这种情况下,由于使用operator+
而不是函数声明/定义,您将再次收到编译错误。
因此,您想要的不是直接的。当然,您可以创建一个重定向调用的内联函数:
inline CNT operator+(CNT a, CNT b) { return addCNT(a, b); }
当我找到相关部分时,我会引用该标准。