gpt4 book ai didi

c++ - SFINAE 方法比较

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:09 25 4
gpt4 key购买 nike

以下代码显示了一个 SFINAE 实现,用于在编译时检查类型(基本上是类)是否包含成员函数 member_func

#define CHECKER(func_name,class_name) sizeof(class_name<T>::template func_name<T>(0)) == 1
#include <iostream>
struct A
{
void member_func();
};
struct B {};
template<typename T>struct Check_If_T_Is_Class_Type
{
template<typename C> static char func (char C::*p);
template<typename C> static long func (...);
enum{val = CHECKER(func,Check_If_T_Is_Class_Type)};
};

//APPROACH 1
template <typename T>struct TypeHasMemberFunc
{
template <typename C, C> struct TypeCheck;
template <typename C> struct Prototype_Holder {typedef void (C::*fptr)();};
template <typename C> static char func(TypeCheck
<
typename Prototype_Holder<C>::fptr,
&C::member_func
>*);
template <typename C> static long func(...);
enum {value = CHECKER(func,TypeHasMemberFunc)};
};

//APPROACH 2
template <typename T>struct has_member_func
{
template<class C> static char func(char (*)[sizeof(&C::member_func)]);
template<class C> static long func(...);
enum{value = CHECKER(func,has_member_func)};
};
int main(){
if(Check_If_T_Is_Class_Type<A>::val)
std::cout<<TypeHasMemberFunc<A>::value; //using APPROACH 1

if(Check_If_T_Is_Class_Type<B>::val)
std::cout<<has_member_func<B>::value; //using APPROACH 2
}

但是我的问题是您更喜欢哪种方法(方法 1 或方法 2),为什么?
您是否发现给定方法有任何不一致之处?如果是,请告诉我。

附言:假设 sizeof(char)!= sizeof(long)

最佳答案

第二种方法不检查函数类型(返回类型或参数类型)并且适用于所有类型,而不仅仅是类类型。

关于c++ - SFINAE 方法比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com