C ++使用任意数量的参数传递任何函数的函数

时间:2013-03-18 13:41:09

标签: c++ function templates arguments

这在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 ++。请帮忙:_ |

3 个答案:

答案 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::functionboost::bind看起来很像这样。