Re[2]: Создать новый std::tuple из подмножества имеющегося
От: SaZ  
Дата: 21.02.23 21:08
Оценка:
Здравствуйте, 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 (частично).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.