【问题标题】:C++11 accessing each variadic parameter [duplicate]C ++ 11访问每个Variadic参数[重复]
【发布时间】:2015-12-27 14:33:40
【问题描述】:

是否可以将可变参数拆分为项目列表并访问它们?下面你可以看到我想要实现的示例 - 第一部分,是标准的,使用可变参数的简单示例

float sum()
{
    return 0;
}

template<typename ... Types>
float sum(float first, Types ... rest)
{
    return first + sum(rest...);
}

下面,你可以看到我想做的事

template<typename ... Types>
float func(int first, Types ... rest)
{
    std::cout<<first<<std::endl;
    for(auto item : rest)
             cout<<rest<<std::endl;
}

我知道我可以递归地打印和执行操作,但是有没有办法在不使用递归的情况下访问参数?

【问题讨论】:

  • 特别是第二个答案,真的是你的。
  • 获得 C++1z 支持后,请查看折叠表达式。他们大部分时间都在使用样板。

标签: c++ c++11 stl variadic-templates variadic-functions


【解决方案1】:
#include <iostream>
#include <string>

template<class...T>
void printall(const T&...t)
{
    using expander = int[];
    auto sep = "";
    (void) expander { 0, ((std::cout << sep << t), sep = ", ", 0)... };
    std::cout << std::endl;
}

using namespace std;

auto main() -> int
{
    auto s = "World"s;
    auto p = "Hello";
    printall(p, s, 5.0, 6);
    return 0;
}

预期输出:

Hello, World, 5, 6

【讨论】:

  • { 0, ((std::cout &lt;&lt; sep &lt;&lt; t), sep = ", ", 0)... } 中的评估顺序是从左到右还是未定义?
  • @AndreyNasonov,它在大括号初始化器中从左到右(在大括号初始化器列表的初始化器列表中,初始化器子句,包括由包扩展产生的任何内容, 按照它们出现的顺序进行评估)。逗号运算符还定义了一个特殊的固定求值顺序(在关于逗号运算符的部分中:用逗号分隔的一对表达式从左到右求值
猜你喜欢
  • 2019-10-20
  • 2014-07-05
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2012-07-10
  • 2016-01-15
相关资源
最近更新 更多