#ifndef TMP_TRAITS_H #define TMP_TRAITS_H #include #include "pack.h" namespace tmp { /** * void_t * * as of C++17, use std::void_t instead */ template using void_t = void; /** * Void * * use to replace `void` when an instance is required */ struct Void {}; // TODO: remove it? template Ostream &operator<<(Ostream &os, Void const&) { return os << "Void{}"; } /** * ReturnType */ template struct ReturnTypeImpl; template struct ReturnTypeImpl { using type = R; }; template using ReturnType = typename ReturnTypeImpl::type; /** * Parameters */ template struct ParametersImpl; template struct ParametersImpl { using type = Pack; }; template using Parameters = typename ParametersImpl::type; /** * invoke_result * as of C++17, use std::invoke_result instead */ template using invoke_result = std::result_of; template using invoke_result_t = typename invoke_result::type; /** * FunctionCat */ template struct FunctionCatImpl; template struct FunctionCatImpl { using type = Ret(Ts..., Us...); }; template using FunctionCat = typename FunctionCatImpl::type; } #endif