2013-08-16 68 views
3

有沒有辦法將一個操作符(特別是操作符>>)重載爲一個函數指針,然後在運行時爲它分配一個函數?我希望能夠在運行時查看文件以確定文件的格式,然後將正確的函數指針分配給操作員,以使其正常工作。在調用操作符之前,我會在構造函數中分配正確的函數。我意識到還有其他(也許更簡單)的方法來做同樣的事情,但我想知道這是否可能。使C++重載操作符成爲函數指針

這裏是我的嘗試:

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

+0

可能重複[是否有可能獲得內置標準運算符的函數指針?](http://stackoverflow.com/questions/17644816/is-it-possible-to-get-the-function-pointer-of-a-內置標準運算符) – aaronman

+0

只需讓'operator >>'函數查看'Flag'並相應地修改其行爲。 –

+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); 
} 
+0

我以爲這就是我所要求的...... –

+0

@ZackSheffield:那麼,我明確地問你是否可以以某種方式分配給輸出操作員。看起來,你真的想知道如何重載輸入操作符,並從那裏做任何你需要做的事情。我添加了這個可以做的例子。 –