Здравствуйте, Voivoid, Вы писали:
V>Здравствуйте, SaZ, Вы писали:
SaZ>>Всем добра,
SaZ>>Ломаю голову над следующей задачей. Дан некий тупл, нужно получить новый, в котором будут только определённые типы (например, унаследованные от некоего my_base класса).
SaZ>>Как это сделать?
V>Если есть C++17, то можно как-то так — https://godbolt.org/z/E6K8Pda36
V>V>#include <tuple>
V>#include <string>
V>#include <iostream>
V>auto typeToFilter(int i) { return std::make_tuple(i); }
V>auto typeToFilter(const std::string& s) { return std::make_tuple(s); }
V>template <typename T>
V>std::tuple<> typeToFilter(const T&) { return {}; }
V>int main() {
V> auto tuple = std::make_tuple(123, std::string("hello"), true, std::string("world"), 0.123);
V> auto filtered = std::apply([](const auto&...ts) {
V> return std::tuple_cat(typeToFilter(ts)...);
V> }, tuple);
V> std::cout << std::get<0>(filtered) << std::endl;
V> std::cout << std::get<1>(filtered) << std::endl;
V> std::cout << std::get<2>(filtered) << std::endl;
V> return 0;
V>}
V>
V>В принципе можно и на C++11 написать с помощью рекурсии, но конечно кода получится побольше
Спасибо за направление, сейчас попробую. У нас С++20 (частично).