使C ++重载操作符成为函数指针

时间:2013-08-16 00:02:40

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

是否有办法将运算符(特别是运算符>>)作为函数指针重载,然后在运行时为其赋值?我希望能够在运行时查看文件以确定文件的格式,然后将正确的函数指针分配给操作符以使其按需工作。在调用运算符之前,我将在构造函数中分配正确的函数。我意识到还有其他(也许更容易)的方法可以做同样的事情,但我想知道这是否可行。

这是我试过的:

bool Flag; // In global scope - set in main()

class MyClass
{
private:
    int data;
    friend istream & function1(istream & in, MyClass & c);
    friend istream & function2(istream & in, MyClass & c);
public:
    MyClass() :data(0) {operator>>=((Flag)?&function1:&function2);}
    friend istream& (*operator>>)(istream & in, C & c);
};

// function1 and function2 definitions go here

int main (int argc, char **argv)
{
    if (argc > 2)
        Flag = ((atoi(argv[1]) > 1) ? 1 : 0);
    MyClass mcInstance;
    ifstream in(argv[2]);
    in >> mcInstance;
    return 0;
}

我收到的错误如下:

error: declaration of ‘operator>>’ as non-function

1 个答案:

答案 0 :(得分:0)

您无法在运行时直接重新定义任何实际函数(包括运算符)的含义:函数是不可变实体。但是,您可以使用指向函数的指针将函数(包括用户定义的运算符)委托给不同的函数。例如:

std::istream&
std::operator>> (std::istream& in, MyClass& object) {
    return Flag? function1(in, object): function2(in, object);
}

如果要通过函数指针(例如每个对象)进行委托,可以在对象中设置函数指针并通过以下方式进行委托:

class MyClass {
    fried std::istream& operator>> (std::istream&, Myclass&);
    std::istream& (*d_inputFunction)(std::istream&, MyClass&);
public:
    MyClass(): d_inputFunction(Flag? &function1: &function2) {}
    // ...
};
std::istream& operator>> (std::istream& in, MyClass& object) {
    return (object.d_inputFunction)(in, object);
}