C++ 如何指定符合标准或自定义类型特征的自定义类
我觉得我错过了什么。我看不出我应该如何指定我的类有什么特点。 例如C++ 如何指定符合标准或自定义类型特征的自定义类,c++,typetraits,C++,Typetraits,我觉得我错过了什么。我看不出我应该如何指定我的类有什么特点。 例如 #包括 福班 { type_trait琐碎地_copyable=true;/? 类型_trait integral=false;/? 公众: foo(const int&val);; int get_x()常量; 私人: int m_x; }; 这在以下情况下很有用: 一个围绕int32的包装器,用作Unicode字符,使用int进行复制优化,但不具有整数特性,因此标准函数不会对其进行计算 具有存储组件的已知数组的大小索引的对
#包括
福班
{
type_trait琐碎地_copyable=true;/?
类型_trait integral=false;/?
公众:
foo(const int&val);;
int get_x()常量;
私人:
int m_x;
};
这在以下情况下很有用:
提前感谢。您不能指定标准特征-这不是目的。性状(和)由 标准库本身 如果一个类没有用户定义的复制构造函数,并且它的非静态数据成员也没有递归的复制构造函数,那么它满足
是可复制的。用户定义的类中没有一个满足的是_integral
因此,在您的示例中,class foo
(如果删除以type\u trait
开头的无效语句)会自动具有您想要的特性,即它是可复制且不完整的
即使您无法明确指定特征,也可以验证它们是否满足要求。例如:
#include <type_traits>
class foo
{
public:
foo(const int& val);
int get_x() const;
private:
int m_x;
};
static_assert( is_trivially_copyable<foo>::value);
#包括
福班
{
公众:
foo(const int&val);;
int get_x()常量;
私人:
int m_x;
};
静态断言(是可复制的::值);
从C++17开始,您可以编写相同的断言:
static_assert( is_trivially_copyable_v<foo>);
静态断言(是可复制的);
您不能指定标准特征-这不是目的。性状(和)由
标准库本身
如果一个类没有用户定义的复制构造函数,并且它的非静态数据成员也没有递归的复制构造函数,那么它满足是可复制的。用户定义的类中没有一个满足的是_integral
因此,在您的示例中,class foo
(如果删除以type\u trait
开头的无效语句)会自动具有您想要的特性,即它是可复制且不完整的
即使您无法明确指定特征,也可以验证它们是否满足要求。例如:
#include <type_traits>
class foo
{
public:
foo(const int& val);
int get_x() const;
private:
int m_x;
};
static_assert( is_trivially_copyable<foo>::value);
#包括
福班
{
公众:
foo(const int&val);;
int get_x()常量;
私人:
int m_x;
};
静态断言(是可复制的::值);
从C++17开始,您可以编写相同的断言:
static_assert( is_trivially_copyable_v<foo>);
静态断言(是可复制的);
C++类型特征是隐式的。你通过满足他们的要求来选择加入或退出他们
1:is_integral
仅标识标准积分类型。包装器类型永远不会满足它,即使是用于数学用途
2-4:您可以删除复制构造函数并使类不可复制,或者使用所需的自定义逻辑定义复制构造函数,这本身使类不容易复制。C++类型特征是隐式的。你通过满足他们的要求来选择加入或退出他们
1:is_integral
仅标识标准积分类型。包装器类型永远不会满足它,即使是用于数学用途
2-4:您可以删除复制构造函数并使类不可复制,或者使用所需的自定义逻辑定义复制构造函数,这本身使类不可复制。那么您的意思是说编写integral=false就类型特征而言,code>会使类成为非整数类吗?不,我不是这么说的。我的意思是,您需要删除以trait
开头的两行代码,标准库将自行决定您的类是非整数的,并且是可复制的。那么有没有办法手动指定trait?没有,您不能手动指定trait。你的意思是说写integral=false就类型特征而言,code>会使类成为非整数类吗?不,我不是这么说的。我的意思是,您需要删除以trait
开头的两行代码,标准库将自行决定您的类是非整数的,并且是可复制的。那么有没有办法手动指定trait?没有,您不能手动指定trait。这并非本意。