c++ 聚合

C++17中聚合的定义
    1、任意数组都被称为聚合。

    2、具有以下特点的类、结构体或者是共用体:

        -没有用户声明的构造函数或者被explict修饰的构造函数。

        -没有using Base::Base()这种的构造函数。    

struct Data{
};
 
struct D: public Data{
    using Data::Data;
};
        -没有private、protected的非静态数据成员。

        -没有虚函数。

        -没有virtual、private、protected的基类。

 C++ 17提供了std::is_aggregate<T>::value 来判断T类型是否是聚合结构(value == True 为聚合)。或者使用辅助函数std::is_aggregate_v<T>来判断。

所以:对于聚合体,在初始化对象时,可用花括号进行对其成员进行赋值

struct B{
    int i = 1;
    std::string str = "Hello Aggregate";
};
 
struct D: public B{
    double d = 10;
};
 
int main(){
    //聚合初始化。

    D d{{100, "Hello World."}, 1};
    std::cout << d.i << " " << d.str << " " << d.d << std::endl;
 
    return 0;
}

 在c++17前,必须实现出构造函数,才能使用D d{100, "Hello World." , 1}来初始化,在C++17中,可以直接使用上述方法来初始化。

延伸:聚合与static_cast

template<typename T>
struct D : std::string, std::complex<T>
{
    std::string data;
};
 
int main(){
 
    D<float> s{{"hello"}, {4.5,6.7}, "world"};                      // OK since C++17
    std::cout << s.data << std::endl;                               // outputs: "world"
    std::cout << static_cast<std::string>(s) << std::endl;          // outputs: "hello"
    std::cout << static_cast<std::complex<float>>(s) << std::endl;  // outputs: (4.5,6.7)
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值