Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;传递具有任意数量参数的任何函数的函数 这在C++中可能不可能,但是我在网上搜索过,没有发现任何有用的东西。_C++_Function_Templates_Arguments - Fatal编程技术网

C++;传递具有任意数量参数的任何函数的函数 这在C++中可能不可能,但是我在网上搜索过,没有发现任何有用的东西。

C++;传递具有任意数量参数的任何函数的函数 这在C++中可能不可能,但是我在网上搜索过,没有发现任何有用的东西。,c++,function,templates,arguments,C++,Function,Templates,Arguments,我不知道这是如何工作的,但如果我将一个函数“a”传递给另一个函数“B”,我可以在“a”中执行函数“B”,如下所示: 模板 作废处理(Func Func){ func(); } void myVoidFunction(){ 不能使用可变模板: template<typename Func, typename Args...> void process(Func func, Args... &&args) { func(std::forward<Args&g

我不知道这是如何工作的,但如果我将一个函数“a”传递给另一个函数“B”,我可以在“a”中执行函数“B”,如下所示:

模板
作废处理(Func Func){
func();
}
void myVoidFunction(){

不能使用可变模板:

template<typename Func, typename Args...>
void process(Func func, Args... &&args) {
    func(std::forward<Args>(args)...);
}
模板
无效进程(函数、参数…&&Args){
func(std::forward(args)…);
}

在C++11中,您可以使用可变模板和完美转发:

template<typename Func, typename... Args>
void process(Func func, Args&&...) {
    func(std::forward<Args>(args)...);
}
模板
无效进程(函数、参数和…){

func(std::forward.

C++11提供了两种方法来做这类事情。一种是可变模板,另一种是
std::bind
。没有C++11,您需要
boost::bind
,但您说没有库。这让您要么滚动自己版本的
bind
,要么执行类似的操作:

template<typename Func> void process(Func func) { func(); }
template<typename Func, typename Arg1Type> void process(Func func, Arg1Type arg1) { func(arg1); }
template<typename Func, typename Arg1Type, typename Arg2Type> void process(Func func, Arg1Type arg1, Arg2Type arg2) { func(arg1, arg2); }
//etc.
模板无效进程(Func Func){Func();}
模板无效进程(Func Func,arg1类型arg1){Func(arg1);}
模板无效进程(Func Func,arg1类型arg1,arg2类型arg2){Func(arg1,arg2);}
//等等。

boost::function
boost::bind
看起来很像这样。

你的答案和@ecatmur的答案本质上是一样的,只是你有
Args&&…Args
,而他在
过程中有
Args…&&Args
签名。这两个都可以接受吗?我很久以前试过这个,试过玩它,这是一个raight up不编译:@Chowlett:不,他可能打错了。只有
Args&&…
在语法上是正确的。错误:我正在使用gnu gcc中的“&&&”标记之前应该是“,”或“…”codeblocks@Luka:哪个版本?另外,您是使用
-std=c++11
选项编译的吗?如您所见,在实时示例中,我链接了代码编译和运行良好。
template<typename Func, typename... Args>
void process(Func func, Args&&...) {
    func(std::forward<Args>(args)...);
}
#include <iostream>
#include <string>

template<typename Func, typename... Args>
void process(Func func, Args&&... args) {
    func(std::forward<Args>(args)...);
}

void myVoidFunction(std::string a, int b, double c) {
    std::cout << a << " " << b << " " << c << std::endl;
}

int main()
{
    process(myVoidFunction, "Hello", 42, 3.14);
}
template<typename Func> void process(Func func) { func(); }
template<typename Func, typename Arg1Type> void process(Func func, Arg1Type arg1) { func(arg1); }
template<typename Func, typename Arg1Type, typename Arg2Type> void process(Func func, Arg1Type arg1, Arg2Type arg2) { func(arg1, arg2); }
//etc.