Re: Можно ли записать читабельнее?
От: sergii.p  
Дата: 04.04.23 09:09
Оценка: 91 (3)
Здравствуйте, Chorkov, Вы писали:

C>Хочется, перебрать все члены tuple, и вызвать функцию (член класса), если у соответствующего объекта она есть.


не понял, что надо, но отвечу Как понял, нужен аналог std::visit для кортежей. Его можно сделать так:

#include <algorithm>
#include <tuple>
#include <iostream>
#include <iomanip>

// определение функции visit
template<typename T, typename V, size_t... I>
void visit_impl(T&& t, V&& v, std::index_sequence<I...>)
{
    (..., v(std::get<I>(t)));
}

template<typename T, typename V>
void visit(T&& t, V&& v)
{
    visit_impl(std::forward<T>(t), std::forward<V>(v),
        std::make_index_sequence<std::tuple_size<
            typename std::decay<T>::type>::value>());
}

// вспомогательный тип для visitor
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

int main()
{
    auto t = std::make_tuple(100, "500", '!');
    visit(t, overloaded {
            [](auto arg) { std::cout << arg << ' '; },
            [](double arg) { std::cout << std::fixed << arg << ' '; },
            [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; } } );
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.