Здравствуйте, 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 написать с помощью рекурсии, но конечно кода получится побольше