【发布时间】:2015-03-09 08:20:17
【问题描述】:
有一个功能
template <class ...T>
void foo(std::function<void(T...)> callback);
我将回调传递到其中。
我想做类似的事情
foo(bar);
例如,bar 在哪里
void bar(int a, long b, double c, float d);
但这给了我
error: no matching function for call to bar(void (&)(int, long int, double, float))
我必须打电话给foo
foo(std::function<void(int, long, double, float)>(bar));
这太冗长了。甚至
foo<int, long, double, float>(bar);
会更好。
foo(bar);
会很理想。
无论如何,我怎样才能让foo 的调用不那么冗长?
编辑:foo 的声明必须保持不变。
【问题讨论】:
-
foo<int, long, double, float>(bar)应该可以工作(请注意,您在 Q 中使用了错误的类型)。你确定不是吗?您还可以展示您最终如何使用此回调吗?也许将它不强制传递给std::function可能是一个解决方案。 -
我看不到一个用例,因为模板不能在不知道参数内容的情况下调用函数。如果模板只转发函数,则该模板的目标也必须处理它。你能给我们一个真实世界的用例来解决这个问题吗?我的想法是,您可以从如何在模板中使用它们的知识中使模板参数可见。
-
template <class F> void foo(F callback);有什么问题?你避免你的问题,不支付类型擦除 -
哦,对了,我会修正类型。当我在 SO 示例中使用不同的代码时,从原始代码复制粘贴。 @Angew 它不起作用,对我吠叫
error: no matching function for call。 -
@PiotrS。他们帮助我好吧,毫无疑问!事实上,
foo函数将填充了网络接收数据的缓冲区拆分为字节块,这样每个块都是其每个可变参数的sizeof,并将这些块应用为callback的参数,调用@ 987654339@和他们一起!所以我们分割网络缓冲区的方式只取决于callback的签名!这种疯狂只有使用可变参数模板才有可能! (哦,别担心,我还有一些类型安全机制)。只是我想让函数调用不那么冗长/显式。