2012-08-12 48 views
0

我想寫你打電話像這樣的功能:匹配可變參數模板參數傳遞給拉姆達參數

f("a", 1,     [](float a     ) { … }); 
f("a", 1, "b", 2,   [](float a, float b  ) { … }); 
f("a", 1, "b", 2, "c", 3, [](float a, float b, float c) { … }); 

函數功能是無關緊要的。的一點是,每對字符* /整數參數f對應於浮動參數來lambda函數。我得到儘可能的:

template <typename ...Args> 
void f(Args... args, std::function<void(???)> cb); 

我怎樣才能申報仿函數類型,以便其參數的基數輸入對的基數相匹配?

+2

你需要的模板是'F'的特定那麼其他重載可以在參數不是這些類型時選擇?如果是的話,你需要一個SFINAE技術。如果沒有,我建議你做的模板比較一般,而在模板定義添加一個'static_assert',使其更容易調試不正確的電話。 – aschepler 2012-08-12 07:46:10

+1

爲什麼不使用像'模板無效F(參數數量&&參數... args,T FUNC)'? – kennytm 2012-08-12 07:49:34

+0

@aschepler:該功能將僅重載對'字符*'/'int'的。當你說「SFINAE」時,你的意思是像KennyTM的建議嗎? – 2012-08-12 08:19:41

回答

2

當需要一個函數對象的說法,通常你應該只允許函數接受任何類型的,並讓編譯器自動發出錯誤時,實際上類型不匹配。

template <typename... Args, typename F> 
void f(const F& func, Args&&... args) { ... } 

(請注意,我提出的功能參數前,因爲一個可變的部分,否則將消耗所有參數。)