gpt4 book ai didi

c++ - 用于检查成员是否存在的模板特化

转载 作者:行者123 更新时间:2023-11-30 05:38:37 25 4
gpt4 key购买 nike

这是对我的问题 SFINAE with variadic templates 的跟进.我试图构建一个名为 has_member 的可变参数模板,用于检查类是否有成员(称为 member)。

我试着看看我是否可以在该问题的答案中使用 size_t 而不是 void 并且不使用可变参数模板,如下所示:

#include <iostream>
#include <vector>
using namespace std;

class ClassWithMember
{
public:
int member;
};
class ClassWithoutMember
{
};

template <typename T,typename=size_t>
class has_member: public std::false_type
{
};
template <typename T>
class has_member<T,decltype(sizeof(typename T::member))>: public std::true_type
{
};

template <typename T1,
std::enable_if_t<has_member<T1>::value>* = nullptr>
void my_function(const T1& obj) { cout<<"Function for classes with member"<<endl; }

template <typename T1,
std::enable_if_t<!has_member<T1>::value>* = nullptr>
void my_function(const T1& obj) { cout<<"Function for classes without member"<<endl; }


int main()
{
ClassWithMember objWithMember;
ClassWithoutMember objWithoutMember;
my_function (objWithMember);
my_function (objWithoutMember);
}

我没有收到任何错误,但从未使用过特化。只有没有成员的类的函数才会被调用。有人可以解释一下原因吗?

最佳答案

T::member 之前的类型名是不需要的。

#include <iostream>
#include <vector>
using namespace std;

class ClassWithMember
{
public:
int member;
};
class ClassWithoutMember
{
};

template <typename T,typename=size_t>
class has_member: public std::false_type
{
};

template <typename T>
class has_member<T,decltype(sizeof(T::member))>: public std::true_type
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
{
};

template <typename T1,
std::enable_if_t<has_member<T1>::value>* = nullptr>
void my_function(const T1& obj) { cout<<"Function for classes with member"<<endl; }

template <typename T1,
std::enable_if_t<!has_member<T1>::value>* = nullptr>
void my_function(const T1& obj) { cout<<"Function for classes without member"<<endl; }


int main()
{
ClassWithMember objWithMember;
ClassWithoutMember objWithoutMember;
my_function (objWithMember);
my_function (objWithoutMember);
}

Demo

[OT] 进一步元编程的提示:您还可以使用真实类型而不是模板进行测试。

关于c++ - 用于检查成员是否存在的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641181/

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