я имел в виду академический вариант: template<typename...Types> struct caller; template<typename Head, typename...Tail> struct caller<Head, Tail...> : caller<Tail...> { using super = caller<Tail...>; static constexpr const char* name() { Head h; if (h.has_name()) { return h.name(); } return super::name(); } }; template<typename Head> struct caller<Head> { static constexpr const char* name() { Head h; if (h.has_name()) { return h.name(); } return "uknown"; } }; struct foo { constexpr bool has_name() const { return true; }; constexpr const char* name() const { return "foo"; }; }; struct boo { constexpr bool has_name() const { return false; }; constexpr const char* name() const { return "boo"; }; }; ... std::cout << caller<boo, foo, boo>::name();
Обсуждают сегодня