Можно ли записать читабельнее?
От: Chorkov Россия  
Дата: 04.04.23 08:30
Оценка:
Хочется, перебрать все члены tuple, и вызвать функцию (член класса), если у соответствующего объекта она есть.

Сейчас для теста использую следующий код:
template<typename T>
static auto foo_if_possible(T& worker, int x)
    -> decltype( worker.foo(x) )
{
    return worker.foo(x);
}
template<typename T>
static void foo_if_possible(T& worker,...)  {}

Который копируется для каждого члена, что неудобно.

Можно как-то упростить или сделать более читаемым?

  Компилируемый пример
https://godbolt.org/z/e4Y51f3zP

#include <mutex>
#include <algorithm>
#include <execution>
#include <iostream>

using namespace std;

struct A {
   void foo(int) { std::cout<<"A::foo"<<std::endl; }
} a;
struct B {
   void bar(const char*) { std::cout<<"B::bar"<<std::endl; }
} b;
struct C {
} c;

auto workers() { 
    return std::tie(a,b,c);  // Тут длинный список
}

template<typename T>
static auto foo_if_possible(T& worker, int x)
    -> decltype( worker.foo(x) )
{
    return worker.foo(x);
}
template<typename T>
static void foo_if_possible(T& worker,...)  {}

template<typename T>
static auto bar_if_possible(T& worker, const char* str)
    -> decltype( worker.bar(str) )
{
    return worker.bar(str);
}
template<typename T>
static void bar_if_possible(T& worker,...)  {}


void foo_all(int x) {
    auto visitor = [x](auto& woker){ foo_if_possible(woker, x); };
    std::apply([visitor](auto...x){(visitor(x),...);}, workers());
}

void bar_all(const char* str) {
    auto visitor = [str](auto& woker){ bar_if_possible(woker,str); };
    std::apply([visitor](auto...x){(visitor(x),...);}, workers());
}

int main(){
    foo_all(42);
    bar_all("str");
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.