C++;传递具有任意数量参数的任何函数的函数 这在C++中可能不可能,但是我在网上搜索过,没有发现任何有用的东西。
我不知道这是如何工作的,但如果我将一个函数“a”传递给另一个函数“B”,我可以在“a”中执行函数“B”,如下所示: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
模板
作废处理(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.