Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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++_Typetraits - Fatal编程技术网

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;
};
这在以下情况下很有用:

  • 一个围绕int32的包装器,用作Unicode字符,使用int进行复制优化,但不具有整数特性,因此标准函数不会对其进行计算
  • 具有存储组件的已知数组的大小索引的对象,并且在复制原始对象时还必须复制该数组对象。因此,尽管该类由所有可复制的基本体组成,但它不会是可复制的
  • 具有唯一ID的对象,即使在复制时也必须更新该ID,从而使其具有非平凡的可复制性
  • 一种复杂的容器类型,它在数据之前存储控制块,使其可以进行简单复制,但也可以选择进行非简单复制以清除碎片内存
  • 我希望有人能解释一下如何在我自己的课程中指定类型特征,那太好了

    作为数字2和4的后续,如果我实现了一个非平凡复制构造函数,编译器会自动将函数标记为不可平凡复制(反之亦然),还是每次都需要手动标记它


    提前感谢。

    您不能指定标准特征-这不是目的。性状(和)由 标准库本身

    如果一个类没有用户定义的复制构造函数,并且它的非静态数据成员也没有递归的复制构造函数,那么它满足
    是可复制的。用户定义的类中没有一个满足
    的是_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会使类成为非整数类吗?不,我不是这么说的。我的意思是,您需要删除以
    trait
    开头的两行代码,标准库将自行决定您的类是非整数的,并且是可复制的。那么有没有办法手动指定trait?没有,您不能手动指定trait。你的意思是说写
    integral=false会使类成为非整数类吗?不,我不是这么说的。我的意思是,您需要删除以
    trait
    开头的两行代码,标准库将自行决定您的类是非整数的,并且是可复制的。那么有没有办法手动指定trait?没有,您不能手动指定trait。这并非本意。