【发布时间】:2012-08-08 20:43:46
【问题描述】:
我想写一个你这样调用的函数:
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 的每一对 char*/integer 参数对应于 lambda 函数的一个浮点参数。我做到了这一点:
template <typename ...Args>
void f(Args... args, std::function<void(???)> cb);
如何声明函子类型,以使其参数的基数与输入对的基数相匹配?
【问题讨论】:
-
您是否需要模板如此具体,以便在参数不是这些类型时可以选择
f的其他重载?如果是,您需要 SFINAE 技术。如果不是,我建议使模板更通用,并在模板定义中添加static_assert,以便更容易调试不正确的调用。 -
为什么不直接使用
template<typename... Args, typename T> void f(Args&&... args, T func)之类的东西? -
@aschepler:该函数只会为成对的
char*/int重载。当您说“SFINAE”时,您是指类似于 KennyTM 的建议吗? -
@KennyTM:我希望能够规定函子的签名,但您的建议就足够了。如果你把它作为一个答案,我可能会接受它。
标签: c++ c++11 lambda variadic-templates