【问题标题】:std::function to variadic member function and then bind variadic template argumentsstd::function 到可变成员函数,然后绑定可变模板参数
【发布时间】:2016-07-27 13:10:30
【问题描述】:

我有两个可变参数类成员函数。 当第一个 Init(...) 被调用时,我想创建一个 std::function 到第二个类成员函数,然后将 Init(...) 的参数绑定到函数指针。

所以稍后我可以直接调用mf_(),而不必再次将所有参数传递给Reset(...)

我想避免将其设为模板类并将参数存储在元组中。

我正在尝试使以下示例工作:

#include <iostream>
#include <string>
#include <functional>

using namespace std;

class Foo
{
public:
    template<typename... T>
    void Init(T&... args)
    {
        cout << __func__ << endl;
        Print(args...);

        // bind args.. to Reset ..
        mf_ = std::bind(&Reset, args...);
       // mf_ = std::bind(&Foo::Reset, this, args...); ???
    }

    template<typename... T>
    void Reset(T&... args)
    {
        cout << __func__ << endl;
    }

    // std::function to Reset(...)
    std::function<void()> mf_;

private:
    template<typename First>
    void Print(First& arg)
    {
        cout << arg << endl;
    }

    template<typename First, typename... Rest>
    void Print(First& arg, Rest&... args)
    {
        cout << arg << " ";
        Print(args...);
    }
};

int main() 
{
    int arg1 = 1;
    int arg2 = 2;
    string arg3 { "test" };
    double arg4 = 1.10;

    Foo foo;
    foo.Init(arg1, arg2, arg3, arg4);

    //foo.mf_();
    return 0;
}

链接到实例:http://cpp.sh/4ylm

编译时出现错误提示

模板参数推导/替换失败:17:37:
注意:无法推导出模板参数'_Result'

【问题讨论】:

  • 请不要在您的问题中编辑解决方案。

标签: c++ variadic-templates variadic-functions std-function stdbind


【解决方案1】:

问题在于&amp;Reset 不是有效的指向成员的指针表达式。

你需要说&amp;Foo::Reset来形成一个指向成员的函数,你还需要提供this指针,所以你几乎是正确的:

   // mf_ = std::bind(&Foo::Reset, this, args...); ???

但它仍然无效,因为Reset 是一个函数模板,所以你需要说明你指的是模板的哪个专业化。

您可以通过提供显式模板参数列表来告诉编译器您想要哪种专业化:

mf_ = std::bind(&Foo::Reset<T&...>, this, args...);

或者通过创建一个从&amp;Foo::Reset初始化的正确类型的变量,它允许编译器推断出你的意思是哪个特化:

void (Foo::*f)(T&...) = &Foo::Reset;
mf_ = std::bind(f, this, args...);

或者通过为正确的类型创建 typedef,并将 &amp;Foo::Reset 转换为该类型:

   using pmf_type = void (Foo::*)(T&...);
   mf_ = std::bind((pmf_type)&Foo::Reset, this, args...);

【讨论】:

  • 谢谢!这是工作。使用实时解决方案演示更新了我的原始问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多