这在c ++中可能无法实现,但我在线搜索并发现似乎没有任何效果。
我不知道它是如何工作的,但是如果我将一个函数“A”传递给另一个函数“B”,我可以执行“A”中的函数“B”,如下所示:
template<typename Func>
void process(Func func) {
func();
}
void myVoidFunction() {
cout << "I did something!?" << endl;
}
process(myVoidFunction); // This will run myVoidFunction();
现在,我不知道如何为具有任意数量的参数的函数执行此操作,我的基本理论是这样的(我希望你知道我的意思):
template<typename Func>
void process(Func func, ...) {
func(...);
}
void myNewFunction(int, int, char*) {}
process(myNewFunction, 1, 2, "Hello World!");
如果进程可以返回与给定函数相同的类型(如果那不要求太多:P),那就更好了。
我不希望任何库执行此操作,我确信有一种方法可以使用JUST C ++。请帮忙:_ |
答案 0 :(得分:5)
在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);
}
查看live example。
答案 1 :(得分:1)
使用可变参数模板:
template<typename Func, typename Args...>
void process(Func func, Args... &&args) {
func(std::forward<Args>(args)...);
}
答案 2 :(得分:0)
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.
boost::function
和boost::bind
看起来很像这样。