c ++ 11 — Range / Loop через N переменных в [modern] переполнении стека

Какой краткий способ ранжирования по N переменным любого типа для выполнения операции?

Допустим, у меня есть переменные a, b, c, d, e и хочу пройти через все они, выполняя какую-то операцию.

2

Решение

Используйте Boost.Hana и общие лямбды:

#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

6

Другие решения

Вы можете использовать: (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 функтор (или общая лямбда (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))), ... );
}
4

Я люблю на основе диапазона для цикла в C ++ 11:

#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;
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector