Здравствуйте, Chorkov, Вы писали:
C>Хочется, перебрать все члены tuple, и вызвать функцию (член класса), если у соответствующего объекта она есть.
C>Сейчас для теста использую следующий код:
C>Который копируется для каждого члена, что неудобно.
C>Можно как-то упростить или сделать более читаемым?
Ну, можно сделать макрос.
#define DECLARE_HAS_MEMBER(member) \
struct has_##member { \
template<class T, class = void> struct test : std::false_type {}; \
template<class T> struct test<T, std::void_t<decltype(&T::member)>> : std::true_type {}; \
}; \
// endmacro
#define HAS_MEMBER(type, member) (has_##member::template test<std::decay_t<type>>::value)
DECLARE_HAS_MEMBER(foo)
DECLARE_HAS_MEMBER(bar)
А функцию-визитёр — лямбдой
visit(your_tuple,
[](auto&& t) {
if constexpr (HAS_MEMBER(decltype(t), foo)) { t.foo(123); }
if constexpr (HAS_MEMBER(decltype(t), bar)) { t.bar("hello"); }
// можно if-else, можно какую угодно логику
}
);