这个问题已经在这里有了答案: > Is it possible to write a template to check for a function’s existence? 25个
如果要编译以下表达式,我想获取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之类的东西,如果表达式编译,它将返回一个常量类型.似乎很容易,但伤了我的头:-)
解决方法:
我个人使用(使用完整签名):
#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)");
标签:c,c11,sfinae 来源: https://codeday.me/bug/20191012/1900177.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。