Хочется, перебрать все члены 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");
}
|
| |