我有一个可变函数,为每个参数调用一个函数。
这就是它的样子:
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;只存在的类允许我传递一个没有值的值,但它使调用函数变得笨拙。正在做我所描述的(或类似的)可能吗?
答案 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