gpt4 book ai didi

c++ - 使 C++ 重载运算符成为函数指针

转载 作者:行者123 更新时间:2023-12-03 19:25:12 25 4
gpt4 key购买 nike

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

这是我尝试过的:

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

最佳答案

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

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

如果您想通过函数指针进行委托(delegate),例如,每个对象,您可以在对象中设置函数指针并通过它进行委托(delegate):
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);
}

关于c++ - 使 C++ 重载运算符成为函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com