如果以下表达式编译,我想得到std :: true_type:
template<typename T>
static constexpr std::true_type check(T*) ??????
std::declval<T>().func_name( std::declval<Args>()... ) // method to check for
和std :: false_type,否则我通常使用
template<typename>
static constexpr std::false_type check(...);
我搜索类似enable_if的东西,如果表达式编译,它会返回一个常量类型。看起来很容易但是让我头疼: - )
答案 0 :(得分:0)
我个人使用它(使用完整签名):
#include <cstdint>
#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature) \
template <typename U, typename... Args> \
class traitsName \
{ \
private: \
template<typename T, T> struct helper; \
template<typename T> \
static std::uint8_t check(helper<signature, &funcName>*); \
template<typename T> static std::uint16_t check(...); \
public: \
static \
constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); \
}
所以在你的情况下,使用类似的东西:
DEFINE_HAS_SIGNATURE(has_func_name, T::func_name, void (T::*)(Args...));
并测试它:
struct C
{
void func_name(char, int);
};
static_assert(has_func_name<C, char, int>::value, "unexpected non declared void C::func_name(char, int)");
static_assert(!has_func_name<C, int, int>::value, "unexpected declared void C::func_name(int, int)");