2014-01-17 22 views
5

假設我們有兩個種類的類最優雅可變參數算符

  • 輸入類Input
    • 限定類型result_type
    • 限定set(result_type)
  • 輸出類Output
    • 定義一種類型result_type
    • 限定result_type get() const
    • 具有許多Input類作爲成員變量,在其它的輸出取決於

給定一個輸出類和幾個輸入類(任意數)的,考慮以下過程:

  • 循環遍歷每個輸入類並調用set()帶一個ap propriate值(預先定義)
  • 在輸出類上調用get()並收集結果。

此過程可以被看作是對函數的調用,將輸入的值作爲參數返回輸出值。

在一般情況下編寫構造這種可變參數函數的函子。

約束條件是:C++(很可能是C++ 11),任意數量的可能不同的輸入類別Input::result_type s。請注意,Input::result_type未必與Output::result_type有關。目標首先應該是效率,但如果代碼優雅可讀,則會有很大的好處。

詳細:對於那些誰不知道Output如何與Input,人們可以想象Inputresult_type get() const方法爲好,它返回無論你通過set()提供。 Output然後有一個構造函數,它接受各種Input s,並將它們(或它們的引用)存儲爲成員變量。 Output::get()然後通過使用其輸入的get()方法的返回值進行一些數學計算,並返回Output::result_type類型的一些結果。

回答

2

這裏是我的解決方案,其他的歡迎

#include <functional> 

template <class Output, class... Inputs> 
std::function<typename Output::result_type(typename Inputs::result_type...)> 
make_function(const Output& output, Inputs&... inputs) { 
    return[&](typename Inputs::result_type... input_vals) { 
    int dummy[]{0, (inputs.set(input_vals),0)...}; 
    return output.get(); 
    }; 
} 

int dummy[]線是由於@ecatmur(https://stackoverflow.com/a/12515637/958110

+0

我並不羞於承認,我完全失去了如何輸出類*接收*輸入實例在執行前進行成員初始化並建立最終的'.get()'。我看到虛擬數組中輸入的擴展,但是他們沒有任何一個與'output'結合,也不能這樣做,因爲'output'是'const'。這就是說,這個問題非常有趣。但請注意,請求是「編寫函子」;你寫了一個*函數*。 – WhozCraig

+0

我會在描述此鏈接的問題中添加註釋。對我來說,一個函數是一個函數,例如一個更高級的函數,一個在函數空間上工作的函數。我可能錯了。 – yannick

+1

@yannick:在其他領域還有其他含義。但是,在C++中,函子是嚴格意義上的一個實現'operator()()'的對象,因此它可以像函數一樣呱呱叫。 – cHao