2010-06-27 43 views
8

我有一個看在加速「功能」類文檔,以及跨越這個偶然:C++在升壓模板發現奇怪的語法參數

boost::function<float (int x, int y)> f; 

我必須承認這個語法是對我來說非常混亂。這怎麼可能是合法的C++?

引擎蓋下有什麼竅門嗎?這種語法是否在任何地方記錄?

+0

請問每個問題只有一個問題 - 如果你有兩個問題要問,請提交兩個單獨的問題。 – bdonlan 2010-06-27 00:43:18

+0

確實,對不起,我不會再這樣做 – Dinaiz 2010-06-27 00:51:07

+0

您可以編輯您的問題以刪除其中一個問題以將其分解爲另一個問題 - 這很難回答,因爲如果某人只知道您的問題的答案,他們會不願意提交答案。 – bdonlan 2010-06-27 01:16:53

回答

9

[編輯]這是對作者原始未經編輯的問題的解答,實際上是兩個問題。

我必須承認這個語法很難 讓我困惑。這怎麼可能是合法的C++ ? :)引擎蓋下有什麼竅門 ?這種語法 記錄在任何地方?

這是完全合法的,它實際上並不太複雜。

template <class T> 
class C 
{ 
public: 
    T* function_pointer; 
}; 

void fn(int x) 
{ 
    cout << x << endl; 
} 

int main(int argc, char** argv) 
{ 
    C<void (int x)> c; 
    c.function_pointer = &fn; 
    c.function_pointer(123); // outputs x 
} 

它基本上是同樣的事情,因爲這樣做:

typedef void Function(int); 
C<Function> c; 

這種類型的不只是適用C++,它只是作爲適用於C(實際的C類爲參數來)。這裏的模板魔術在這裏採用了類似於Function typedef的東西,並且能夠檢測返回值和參數的類型。在這裏解釋這將太長,boost :: function使用boost中的許多函數特徵元模板來檢索該信息。如果你真的想花時間學習這些,你應該嘗試從Boost.Type Traits中的boost :: function_traits開始瞭解boost實現。

但是,我想解決您的一般問題。我認爲你正在努力簡化幾行完全可以接受的代碼。通過參數化的子類構造函數爲命令子類傳遞參數沒有任何問題。在這裏真的值得嘗試使用typelists和boost :: function-like解決方案,從而顯着增加編譯時間和代碼複雜性,僅此而已?

如果你想進一步降低它,只寫一個執行的功能,將執行任何命令的子類,並把它添加到撤消堆棧等:

typedef boost::shared_ptr<Command> CommandPtr; 

void execute(const CommandPtr& cmd) 
{ 
    cmd->execute(); 
    // add command to undo stack or whatever else you want to do 
} 

// The client can simply write something like this: 
execute(CommandPtr(new CmdAdd(some_value)); 

我真的想嘗試的權衡讓它更復雜是不值得的。 boost作者希望爲boost :: function編寫一個非常通用的解決方案,許多平臺和編譯器都會使用它。然而,他們並沒有試圖概括一個能夠在一個統一的撤銷系統中執行具有不同簽名的功能的命令系統(因此要求這些命令的狀態即使在初始完成後調用它們並且能夠撤銷和重新保存 - 執行它們而不必在後續執行中重新指定原始狀態數據)。爲此,您的基於繼承的方法很可能是最好,最直接的方法。

+2

'typedef float(int,int)Command',我很抱歉地說,不合法C.正確的C代碼是'typedef float Command(int,int)'。 'typedef'接受一個正則聲明,而不是定義命名對象(即函數或變量),它使用該名稱作爲對象的類型類型的別名。 – 2010-06-27 02:23:09

+0

+1很好的答案 – fingerprint211b 2010-06-27 02:25:54

+0

@Dale道歉,你是正確的,這在C++中也是非法的。當試圖用C c解釋C被參數化時,這是一個草率的錯誤;這相當於寫作: typedef float Command(int,int); c。 c。我編輯它來糾正錯誤。 – stinky472 2010-06-27 02:33:35