30 lines
1.1 KiB
C
30 lines
1.1 KiB
C
|
#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
|