【问题标题】:Is there a way to pass void as an argument?有没有办法将 void 作为参数传递?
【发布时间】:2017-07-10 07:45:20
【问题描述】:

我有一个可变参数函数,它为每个参数调用一个函数。

这就是它的样子:

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&lt;int&gt;(2) 两次,然后调用Call()。但我需要能够拨打PushArg 但没有任何价值。

我想要做的是Call(2, void, 4) 并让它调用PushArg&lt;int&gt;(2)PushArg&lt;void&gt;(),然后是PushArg&lt;int&gt;(4)

目前我有一个“null”类,它只允许我传递一个没有值的值,但这使得调用函数很尴尬。做我描述的(或类似的)可能吗?

【问题讨论】:

  • 不,你不能让 C++ void 担任这个角色。您需要使用占位符。
  • 可变参数Call函数中使用的arg在哪里定义?
  • @Cheersandhth.-Alf 你能解释一下你在问什么吗?我不得不大量修改原始代码以使其小而易读,所以我可能不小心遗漏了一些重要的东西。
  • 对不起,我现在看到了,显然这个问题还没有被编辑。忽略这一点,这是我的眼睛或视觉子系统在欺骗我。 请发布真实代码。在发布之前编译它。通过复制和粘贴的方式发布,而不是重新输入。

标签: c++ c++11 templates variadic-templates void


【解决方案1】:

不,您不能将类型作为函数的参数传递。我能想到的唯一解决方案是一种特殊类型(我想是你的“空类”)来替换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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多