2

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

4

3 回答 3

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);
}

看一个活生生的例子

于 2013-03-18T13:46:52.647 回答
1

使用可变参数模板:

template<typename Func, typename Args...>
void process(Func func, Args... &&args) {
    func(std::forward<Args>(args)...);
}
于 2013-03-18T13:46:50.820 回答
0

C++11 gives two ways to do things like this. One is variadic templates and the other is std::bind. Without C++11, you're looking for boost::bind but you said no libraries. That leaves you with either rolling your own version of bind or doing something like this:

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 and boost::bind look a lot like this.

于 2013-03-18T13:52:25.950 回答