在[modern] C ++中通过N个变量进行范围/循环

时间:2014-04-23 05:50:10

标签: c++ c++11 boost c++14 c++17

通过各种类型的N个变量进行操作的简洁方法是什么?

假设我有变量abcde,并希望通过所有变量执行某些操作。< / p>

3 个答案:

答案 0 :(得分:6)

使用Boost.Hana和通用lambdas:

#include <tuple>
#include <iostream>
#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>

struct A {};
struct B {};
struct C {};
struct D {};
struct E {};

int main() {
    using namespace std;
    using boost::hana::for_each;

    A a;
    B b;
    C c;
    D d;
    E e;

    for_each(tie(a, b, c, d, e), [](auto &x) {
        cout << typeid(x).name() << endl;
    });
}

http://coliru.stacked-crooked.com/a/ccb37ec1e453c9b4

答案 1 :(得分:4)

您可以使用:(C ++ 11)(https://ideone.com/DDY4Si

template <typename F, typename...Ts>
void apply(F f, Ts&&...args) {
    const int dummy[] = { (f(std::forward<Ts>(args)), 0)... };
    static_cast<void>(dummy); // avoid warning about unused variable.
}

使用F一个仿函数(或一个普通的lambda(C ++ 14))。 你可以在C ++ 14中这样称呼它:

apply([](const auto &x) { std::cout << typeid(x).name() << std::endl;}, a, b, c, d, e);

在C ++ 17中,使用折叠表达式,它将是:

template <typename F, typename...Ts>
void apply(F f, Ts&&...args) {
    (static_cast<void>(f(std::forward<Ts>(args))), ... );
}

答案 2 :(得分:0)

我喜欢C ++ 11中的range-based for loop

#include <iostream>  

struct S {int number;};

int main() {
    S s1{1}; 
    S s2{2};
    S s3{3};

    for (auto i : {s1, s2, s3}) {
        std::cout << i.number << std::endl;
    }
}