模板专门化以检查成员是否存在
Template specialization to check whether a member is present
这是我的问题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]只是进一步元编程的提示:您还可以通过使用实际类型而不是模板进行测试。
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 将结构别名为其第一个成员是否严格违反别名
- 将指针指向它的第一个成员是否违法?
- 常量指针到成员是否默认指向 int?
- 友元函数将内存分配给数组成员是否有任何限制?
- 检查成员是否在类中声明
- 给定仅包含布尔类型成员的结构的两个对象 s1 和 s2,只要 s1 的成员为 true,请检查 s2 的每个成员是否为真
- 未使用的数据成员是否占用内存
- 静态数据成员是否在所有类对象之前初始化?
- 如何检查两个元组的所有成员是否不同
- 使用之前在初始值设定项列表中初始化的成员初始化成员是否安全
- 使用enableif检查成员是否存在
- 类的成员是否可以与其类型(另一个类)命名相同的名称
- 堆分配类的成员是否在堆中自动分配
- 成员是否继承自超类的超类
- std::函数成员是否可以访问其他成员
- C++预处理器测试类成员是否存在