2012-08-12 49 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) { ... } 

(请注意,我提出的功能参数前,因为一个可变的部分,否则将消耗所有参数。)