模板专门化以检查成员是否存在

Template specialization to check whether a member is present

本文关键字:成员 是否 存在 检查 专门化      更新时间:2023-10-16

这是我的问题SFINAE与可变模板的后续。我试图构建一个名为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);
}

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