当前位置: 首页 > 知识库问答 >
问题:

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

齐健柏
2023-03-14

我有两个变量类成员函数。当第一个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;
}

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

当我编译时,我得到一个错误

模板参数推断/替换失败:17:37:
注意:无法推断模板参数“\u Result”

共有1个答案

颜德馨
2023-03-14

问题是

你需要说

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

但它仍然无效,因为Reset是一个函数模板,所以您需要说明您所指的模板的具体化。

通过提供一个显式模板参数列表,您可以告诉编译器需要哪种专门化:

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

或者通过创建正确类型的变量,从

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

或者为正确的类型创建typedef,并强制转换

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

 类似资料:
  • 我试图编写一个通用的obj工厂,使用可变模板调用各种类的构造函数。代码如下: 在大多数例子中,变量arg总是这样写“Args” 错误:没有可行的转换从'__bind( 在移除“ 但我不知道为什么?

  • 以这种方式传递参数有问题,我得到以下错误:“std::thread::thread”:没有重载函数接受4个参数。我怎么能这么做?

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 以下是我的代码:< br > 一开始我只是重载了函数,发现有很多类似的代码。所以我正在考虑使用可变参数模板来获得更好的设计。(如果两个重载函数相似,如何做出更好的设计) 但是我不知道为什么会有错误:< br > main.cpp:27: 8:错误:没有匹配函数调用'getChar'ch=getChar(1, std::forward(str)...); 主要的cpp:37:2:注意:在函数模板专门

  • 受这个答案的启发,我生成了这段代码,其输出取决于编译器: 如果使用 GCC 11 编译,调用

  • Scala 函数 Scala 允许你指明函数的最后一个参数可以是重复的,即我们不需要指定函数参数的个数,可以向函数传入可变长度参数列表。 Scala 通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。例如: object Test { def main(args: Array[String]) { printStrings("Runoob", "Scala",