Re: Создать новый std::tuple из подмножества имеющегося
От: Voivoid Россия  
Дата: 21.02.23 21:04
Оценка: 7 (2)
Здравствуйте, SaZ, Вы писали:

SaZ>Всем добра,


SaZ>Ломаю голову над следующей задачей. Дан некий тупл, нужно получить новый, в котором будут только определённые типы (например, унаследованные от некоего my_base класса).

SaZ>Как это сделать?
Если есть C++17, то можно как-то так — https://godbolt.org/z/E6K8Pda36
#include <tuple>
#include <string>
#include <iostream>

auto typeToFilter(int i) { return std::make_tuple(i); }
auto typeToFilter(const std::string& s) { return std::make_tuple(s); }

template <typename T>
std::tuple<> typeToFilter(const T&) { return {}; }

int main() {

    auto tuple = std::make_tuple(123, std::string("hello"), true, std::string("world"), 0.123);
    auto filtered = std::apply([](const auto&...ts) {
        return std::tuple_cat(typeToFilter(ts)...);
    }, tuple);

    std::cout << std::get<0>(filtered) << std::endl;
    std::cout << std::get<1>(filtered) << std::endl;
    std::cout << std::get<2>(filtered) << std::endl;

    return 0;
}


В принципе можно и на C++11 написать с помощью рекурсии, но конечно кода получится побольше
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.