2017-02-20 8 views
0

私は、各引数に対して関数を呼び出すvariadic関数を持っています。私はそれが二回PushArg<int>(2)を呼び出してから、Call()を呼び出しますCall(2, 2)で関数を呼び出す場合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) 
{ 

} 

これは、次のようになります。しかし、私はPushArgに電話する必要がありますが、価値はありません。

私ができることをやりたいことはCall(2, void, 4)で、PushArg<int>(2)PushArg<void>()、次にPushArg<int>(4)としてください。

現時点では、値のない値を渡すことができる「null」クラスしかありませんが、関数を厄介なものに呼び出すことになります。私が記述したこと(または類似のもの)を可能にしていますか?

+0

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

を提案します。プレースホルダを使用する必要があります。 –

+0

variadicの 'Call'関数で使われている' arg'はどこに定義されていますか? –

+0

@ Cheersandhth.-Alfあなたは何を求めているのか説明できますか?私はそれを小さく読みやすくするために元のコードを大きく変更しなければならなかったので、私は誤って何か重要なものを省いた可能性があります。 – user112513312

答えて

2

いいえ、関数の引数として型を渡すことはできません。私が考えることができる唯一の解決策は、voidを代用する特別なタイプ(あなたの "ヌルクラス"、私が推測する)です。

私はそれはきれいな解決策だと思うので、私はありません、あなたがC++ `void`がこの役割を埋めることはできませんプログラム例のプリント

- generic (T) PushArg 
- int PushArg 
- void PushArg 
- int PushArg 
- generic (T) PushArg 
関連する問題