【问题标题】:Match variadic template args to lambda parameters将可变参数模板 args 与 lambda 参数匹配
【发布时间】: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&lt;typename... Args, typename T&gt; void f(Args&amp;&amp;... args, T func)之类的东西?
  • @aschepler:该函数只会为成对的char*/int 重载。当您说“SFINAE”时,您是指类似于 KennyTM 的建议吗?
  • @KennyTM:我希望能够规定函子的签名,但您的建议就足够了。如果你把它作为一个答案,我可能会接受它。

标签: c++ c++11 lambda variadic-templates


【解决方案1】:

当需要函数对象参数时,通常你应该只允许函数接受任何类型,并让编译器在类型实际不匹配时自动发出错误。

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

(请注意,我将函数参数移到了前面,否则可变参数部分将消耗所有参数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2016-12-01
    相关资源
    最近更新 更多