2017-02-20 244 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 
相关问题