Идиома обнаружения работает следующим образом
template<typename T, typename = void>
struct has_foo {static constexpr bool value = false;};
template<typename T>
struct has_foo<T, std::void_t<decltype(&T::foo)>> {static constexpr bool value = true;};
template<typename T>
constexpr bool has_foo_v = has_foo<T>::value;
И тогда мы можем обнаружить наличие foo
в любом типе T
.
if constexpr(has_foo_v<decltype(var)>)
var.foo();
Моя проблема в том, что довольно много набирать (читай: хочу сильно разбить клавиатуру, чтобы напечатать), и я подумал, возможно ли следующее
if constexpr(std::void_t<decltype(&decltype(var)::foo)>(), true)
var.foo();
Это не так.
Есть ли причина этого?
Более конкретно, какие компромиссы должны быть сделаны, если бы это было разрешено?