Здравствуйте, 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;
}