簡體   English   中英

使用boost :: function作為函數參數?

[英]Use boost::function as function argument?

我想調用一個函數foo,讓它表現得與眾不同。
(我正在采用策略或命令模式。它們看起來和我類似。)

我的整體計划如下......

首先,定義foo以采用boost :: function類型

 foo(boost::function<someType> execFunction) { // do something execFunction(args); // do something } 

然后,我根據我的需要給foo()不同的函數(作為參數)。

這會有用嗎? 或者你會反對嗎?
歡迎任何評論。

編輯

次要的相關問題是,有時execFunction需要1個參數,有時需要2個參數。

我可以在兩種情況下使用boost :: function,並在不需要時忽略第二個參數。
有更清潔的方法嗎?

這非常有效。 但有時候最好使用仿函數,這樣你的調用者可以自由選擇最適合它們的東西,並防止boost::function帶來的小額開銷:

template<typename Func>
void foo(Func f) {
  f(myArgs);
}

您還可以為特定的boost::function添加重載,以通過引用獲取對象。

template<>
void foo(const boost::function<void (expectedtypes)>& f) {
  f(myArgs);
}

並且可能也為constness重載了。

對於接受不同arity的boost::function對象的情況,我會使用重載。 如果你走那條路,那就避免使用模板化的版本,因為一旦用戶嘗試使用仿函數(而不是使用不同的arity的boost::function ),你就會遇到麻煩。 這個麻煩是可以解決的,但可能會變得混亂。 您需要將調用發送到檢測向導的arity並執行正確調用的內容。 但正如你所說模板是你的弱點,這並不是真的值得推薦的。

這是一種常見的模式,並且會起作用。 我過去曾經使用過它,並且很可能在將來使用它。 我嘗試僅在某些特定的用例中使用它,因為它減少了極大的耦合,雖然這通常是好的,但它更難以遵循代碼中的控制流(即如果你濫用它,它將是真的除了在調試器中運行它之外,很難找到你的程序要做的事情。 但對於特定的任務,這很好。

如果您不需要存儲function<>供以后使用,或者在被調用方存儲任何運行時多態行為,您還可以考慮使用函數模板,以便調用者在執行之前不需要轉換為function<>功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM