有没有办法将void作为参数传递?

时间:2017-02-20 21:30:42

标签: c++ c++11 templates variadic-templates 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)

目前我有一个&#34; null&#34;只存在的类允许我传递一个没有值的值,但它使调用函数变得笨拙。正在做我所描述的(或类似的)可能吗?

1 个答案:

答案 0 :(得分:2)

不,您不能将类型作为函数的参数传递。我能想到的唯一解决方案是替换void的特殊类型(您的#34; null类&#34;,我认为)。

我认为这是一个干净的解决方案,所以我提出了一个例子

#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