#pragma once #include <type_traits> // std::enable_if namespace ipc { // concept helpers template <bool Cond, typename R = void> using require = typename std::enable_if<Cond, R>::type; #ifdef IPC_CONCEPT_ # error "IPC_CONCEPT_ has been defined." #endif #define IPC_CONCEPT_(NAME, WHAT) \ template <typename T> \ class NAME { \ private: \ template <typename Type> \ static std::true_type check(decltype(std::declval<Type>().WHAT)*); \ template <typename Type> \ static std::false_type check(...); \ public: \ using type = decltype(check<T>(nullptr)); \ constexpr static auto value = type::value; \ } } // namespace ipc