【问题标题】:function with function object argument of different signatures具有不同签名的函数对象参数的函数
【发布时间】:2014-01-08 00:05:27
【问题描述】:

我尝试使用具有不同签名的 boost::function 重载一个函数,但它不起作用。 我尝试使用 template<Signature> Connection *connect(boost::function<Signature> f) 也失败了,因为 boost::bind 不会以这种方式隐式转换

我想要做的正是 boost::signals 所做的。 Boost 信号可以同时接受不带参数的函数对象和带 N 个参数的函数对象

我想知道如何在一个函数中同时接受这两种类型的函数对象。

【问题讨论】:

    标签: c++ boost boost-bind boost-function boost-signals


    【解决方案1】:

    您可以使用可变参数模板:

    template<typename R, typename... Args>
    Connection* connect(boost::function<R (Args...)> f);
    

    这将接受一个接受 0 个参数的函数或一个接受 N 个参数的函数。

    【讨论】:

    • 我试过了,但是,我得到一个编译错误“ServerSignal(70): error C2143: syntax error: missing ',' before '...'”。也许我的编译器不是最新的?我正在使用 Visual Studio 2012。还有其他方法吗?我想使用一种更向后兼容的方法。知道提升是如何实现的吗?我正在使用 2 个函数对象,一个带有参数,另一个没有。我需要使用正确的连接方法来决定使用哪个函数对象。
    • @SaifUrRehman Visual Studio 2012 不幸的是不支持可变参数模板,我不确定 boost 是如何做到的。我唯一的建议是在 function&lt;R (Arg)&gt;function&lt;R ()&gt; 上使用函数重载。
    • @SaifUrRehman 我认为这个问题的答案可能会给你一些帮助。 stackoverflow.com/questions/18237350/…
    • @SaifUrRehman 另一件事是实现一个相对简单的类型列表。这是现代 C++ 设计中显示的类型列表的源代码 -- loki-lib.sourceforge.net/html/a00681.html
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2015-11-30
    • 2018-01-10
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多