Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化以检查成员是否存在_C++_Templates_C++11 - Fatal编程技术网

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

C++ 模板专门化以检查成员是否存在,c++,templates,c++11,C++,Templates,C++11,这是我问题的后续行动。我试图构造一个名为has_member的可变模板,用于检查类是否有成员(称为member) 我试图在回答该问题时使用size\u t而不是void,并且不使用可变模板,如下所示: #include <iostream> #include <vector> using namespace std; class ClassWithMember { public: int member; }; class ClassWithoutMemb

这是我问题的后续行动。我试图构造一个名为
has_member
的可变模板,用于检查类是否有成员(称为
member

我试图在回答该问题时使用
size\u 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);
}
#包括
#包括
使用名称空间std;
有成员的类
{
公众:
国际会员;
};
没有成员的类
{
};
模板
类具有\u成员:public std::false\u类型
{
};
模板
类具有\u成员:public std::true\u类型
{
};
模板

void my_function(const T1&obj){coutI没有错误,但从未使用专门化。只调用没有成员的类的函数。有人能解释一下原因吗?

不需要
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);
}
#包括
#包括
使用名称空间std;
有成员的类
{
公众:
国际会员;
};
没有成员的类
{
};
模板
类具有\u成员:public std::false\u类型
{
};
模板
类具有\u成员:public std::true\u类型
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
{
};
模板
void my_函数(const T1&obj){cout


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

成功了!您可以添加一个简短的解释吗?看起来实类型没有问题。它显然是在c++0x中引入的。那么,模板为什么会有问题呢?我解释了Denis在文章末尾提到的内容回答,没有任何错误。更正了它,没有必要使用
typename
关键字。我认为它不是依赖类型:
error:typename说明符是指“ClassWithMember”中的非类型成员“member”
Hmm。是的。我没有看到您提到的错误,但member不是真正的类型。这就解释了。。