std :: function到可变参数成员函数,然后绑定可变参数模板参数

奥德

我有两个可变参数类成员函数。当第一个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'

乔纳森·韦克利(Jonathan Wakely)

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

您需要说&Foo::Reset形成一个指向成员的指针函数,并且还需要提供该this指针,因此您几乎可以正确地做到:

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

但是它仍然Reset无效的,因为它是一个功能模板,因此您需要说出该模板的含义是什么。

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

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

或者通过创建正确类型的变量(从初始化)&Foo::Reset,允许编译器推断出您要表示的专业化程度:

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

或通过为正确的类型创建typedef并强制&Foo::Reset转换为该类型:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: function的可变参数模板参数

std::invoke 不喜欢可变参数模板成员函数?

可变参数模板作为std :: function的参数

std :: function中的可变参数模板参数匹配

使用std :: function作为参数的可变参数模板

多维std :: array的可变参数模板

std :: bind与可变参数模板成员函数和通用引用

可变参数模板,类型扣除和std :: function

如何使用可变参数模板使用std :: function

可变参数模板,std :: function和lambdas作为类成员

为什么模板参数推导因std :: function回调的可变参数模板参数而失败?

从具有可变参数模板构造函数的类型构造 std::function 对象

可变参数模板类-可变参数成员函数

如何从可变参数模板参数创建std :: tuple <>?

使用来自 std::vector 的参数调用可变参数模板化函数

绑定到可变参数成员函数

可变参数模板和std :: array意外行为

在可变参数模板中使用std :: placeholders

C ++ 11可变参数模板和std :: endl

std :: holds_alternative可变参数模板

std :: bind与可变参数模板和自动返回类型

计算可变参数模板元组中的 std::optional 类型

对可变参数模板结构使用std :: visit

constexpr可变参数模板并解压std :: array

可变参数模板展开到std :: tuple

可变参数模板函数:没有匹配的调用函数,std :: endl

C ++可变参数模板打包到std :: array中并解压缩

函数采用可变参数模板包将std :: strings转换为const char *?

从可变参数模板数组引用构造函数初始化双嵌套std :: array