为操作符重载函数分配兼容的函数地址

时间:2016-03-17 19:15:49

标签: c++ overloading

我认为函数的定义就像分配给左边部分一样。 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;
    }

3 个答案:

答案 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); }

当我找到相关部分时,我会引用该标准。