2013-03-18 76 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看起來就像這樣。