Modify the detect class to allow variable arguments:
template <typename...> using void_t = void; template <typename AlwaysVoid, template <typename...> class Operation, typename... Args> struct detect_impl : std::false_type { }; template <template <typename...> class Operation, typename... Args> struct detect_impl<void_t<Operation<Args...>>, Operation, Args...> : std::true_type { };
Add an alias that hardcodes the void type:
template <template <typename...> class Operation, typename... Args> using detect = detect_impl<void, Operation, Args...>;
Record Detector:
template <typename T, typename... Us> using has_constructor = decltype(T(std::declval<Us>()...));
Check your class:
static_assert(detect<has_constructor, foo, foo>{}, "!");
Demo
source share