我有两个变量类成员函数。当第一个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”
问题是
你需要说
// 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",