【问题标题】:why parameter pack expansion is so limited?为什么参数包扩展如此有限?
【发布时间】:2014-06-20 06:35:14
【问题描述】:

我想知道,为什么 C++11 中的参数包扩展如此有限——这只是 C++11 标准中的疏忽吗?为什么不能只做bar(args)...;?有可能比我做得更好吗?

#include <iostream>

int bar(int i)
{
    std::cout << i << ' ';
    return 0;
}

template <typename T>
void boo(T t)
{
    bar(t);
}

template <typename T, typename... Args>
void boo(T t, Args&&... args)
{
    bar(t);
    boo(args...);
}

template <typename... Args>
void dummy(Args&&... args)
{
}

template <typename... Args>
void foo(Args&&... args)
{
    dummy(bar(args)...);

    std::cout << std::endl;

    int dummy1[sizeof...(Args)] = { (bar(args), 0)... };

    std::cout << std::endl;

    boo(args...);
}

int main()
{
    foo(1, 3, 5);
}

【问题讨论】:

  • 可能是因为潜在的歧义。此外,C++ 习惯于实现尽可能少的功能,以使某些事情并非完全不可能。
  • “你只需为你使用的东西付费”,对吗?
  • 将“dummy”重命名为“for_each_arg”,你就赢了。 :-)
  • @HowardHinnant 注意 bar() 必须返回一些东西,所以需要更多的代码来包装 void 函数
  • 是的,我很熟悉...

标签: c++ c++11


【解决方案1】:

The reference 提到了允许参数包扩展的不同上下文。所以,一个稍微更简洁的方法是

auto a = {bar(args)...};

如果 bar 的返回类型为 void,这将不起作用。

【讨论】:

  • 要让它处理void 返回类型和潜在的逗号运算符重载,请使用auto a = {(bar(args)..., void(), 0)};
  • @Praetorian:这很酷,但是你有一点语法错误:auto a = {(bar(args), void(), 0)...};
  • @HowardHinnant 你应该以,0 结尾,以防args... 为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2020-01-06
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多