Re: Можно ли записать читабельнее?
От: Кодт Россия  
Дата: 07.04.23 19:59
Оценка:
Здравствуйте, 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, можно какую угодно логику
  }
);
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.