2017-02-20 168 views
0

我有一個可變參數函數爲每個參數調用一個函數。有沒有辦法將void作爲參數傳遞?

這是什麼樣子:

void Call() 
{ 

} 

template<typename T> 
void Call(T arg) 
{ 
    PushArg(arg); 
    Call(); 
} 

template<typename T, typename ...Args> 
void Call(T arg, Args... args) 
{ 
    PushArg(arg); 
    Call(std::forward<Args...>(args)...); 
} 

template<typename T> 
void PushArg(T arg) 
{ 

} 

template<> 
void PushArg<int>(int arg) 
{ 

} 

如果我調用該函數與Call(2, 2)它會調用PushArg<int>(2)兩次,然後調用Call()。但我需要能夠撥打PushArg,但沒有價值。

我想要做的是做Call(2, void, 4),並讓它叫PushArg<int>(2),PushArg<void>(),然後PushArg<int>(4)

目前我有一個「空」類,只存在允許我傳遞一個沒有值的值,但它使得調用該函數很笨拙。正在做我所描述的(或類似的事情)嗎?

+0

不,你不能讓C++'void'充當這一角色。你需要使用佔位符。 –

+0

在可變參數調用函數中使用的'arg'在哪裏定義? –

+0

@ Cheersandhth.-Alf你能解釋一下你在問什麼嗎?我不得不大量修改原始代碼以使其更小,更易讀,所以我可能會意外地忽略了一些重要的東西。 – user112513312

回答

2

不,你不能傳遞一個類型作爲函數的參數。我能想到的唯一解決方案是用一個特殊的類型(我認爲你的「空類」)代替void

我認爲這是一個乾淨的解決方案,所以我提出一個例子

#include <utility> 
#include <iostream> 

struct voidWrp 
{ }; 

void PushArg() 
{ std::cout << "- void PushArg" << std::endl; } 

template <typename T> 
void PushArg (T arg) 
{ std::cout << "- generic (T) PushArg" << std::endl; } 

template <> 
void PushArg<int> (int arg) 
{ std::cout << "- int PushArg" << std::endl; } 

void Call() 
{ } 

template <typename T> 
void Call (T arg) 
{ 
    PushArg(arg); 
    Call(); 
} 

template <typename T, typename ... Args> 
void Call (T arg, Args ... args) 
{ 
    PushArg(arg); 
    Call(std::forward<Args>(args)...); 
} 

template <typename ... Args> 
void Call (voidWrp const &, Args ... args) 
{ 
    PushArg(); 
    Call(std::forward<Args>(args)...); 
} 

int main() 
{ 
    Call("std::string value", 3, voidWrp{}, 6, 7L); 
} 

的例子程序打印

- generic (T) PushArg 
- int PushArg 
- void PushArg 
- int PushArg 
- generic (T) PushArg 
相關問題