2013-03-18 80 views
2

这可能不是在C++中任何可能的功能,但我在网上搜索,发现没有什么似乎工作。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++。请帮忙:_ |

回答

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

+0

你的答案,并@ ecatmur的在本质上是相同的,除非你有'参数数量&& ... args',而他在'process'签名'参数数量...... && args'。都可以接受吗? – Chowlett 2013-03-18 13:51:17

+0

我很久以前试过这个,试过用它玩,这个直接不用编译: – Luka 2013-03-18 13:51:27

+0

@Chowlett:不,他可能犯了一个错字。只有'Args && ...'在语法上是正确的。 – 2013-03-18 13:52:45

1

使用可变参数模板:

template<typename Func, typename Args...> 
void process(Func func, Args... &&args) { 
    func(std::forward<Args>(args)...); 
} 
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看起来就像这样。