Поздний ответ, но вот общее решение с C++ 14, который работает как boost::fusion::for_each
но не требует подталкивание:
#include <tuple>
namespace detail {
template<typename Tuple, typename Function, std::size_t... Is>
void tuple_for_each_impl(Tuple&& tup, Function&& fn, std::index_sequence<Is...>) {
using dummy = int[];
static_cast<void>(dummy {
0, (static_cast<void>(fn(std::get<Is>(std::forward<Tuple>(tup)))), 0)...
});
}
}
template<typename Function, typename... Args>
void tuple_for_each(std::tuple<Args...>&& tup, Function&& fn) {
detail::tuple_for_each_impl(std::forward<std::tuple<Args...>>(tup),
std::forward<Function>(fn), std::index_sequence_for<Args...>{});
}
int main() {
tuple_for_each(std::tie(w1, w2, w3, w4, w5, w6, t1, t2, t3), [](auto&& arg) {
arg.show();
});
}
Если вы хотите добиться более или менее То же самое без std::tuple
, вы можете создать одну функцию вариант кода выше:
#include <utility>
template<typename Function, typename... Args>
void va_for_each(Function&& fn, Args&&... args) {
using dummy = int[];
static_cast<void>(dummy {
0, (static_cast<void>(fn(std::forward<Args>(args))), 0)...
});
}
int main() {
auto action = [](auto&& arg) { arg.show(); };
va_for_each(action, w1, w2, w3, w4, w5, w6, t1, t2, t3);
}
Недостатком т второй пример заключается в том, что для этого сначала необходимо указать функцию обработки, поэтому не имеет такого же вида, как хорошо известный std::for_each
. В любом случае с моим компилятором (GCC 5.4.0) с использованием уровня оптимизации -O2
, они производят те же assembly output.
[Использовать 'tuple'] (http://stackoverflow.com/q/1198260/1171191) – BoBTFish
@LogicStuff Я не могу сделать все классы наследуемыми от чего-то с помощью' virtual void show() ', it также должен работать с '.size()' и std-контейнерами. – nwp
Является ли списком время выполнения или время компиляции? вы всегда можете развернуть несколько вызовов для одной и той же функции [например, здесь] (http://coliru.stacked-crooked.com/a/7543103223c64c86) –