typeof()和decltype()的使用

这段代码展示了在C++中使用decltype和__typeof__两种方式对浮点数数组进行类型转换的示例。程序分配了一个float类型的数组,然后通过reinterpret_cast将其转换为float[10]类型,分别用decltype和__typeof__实现了相同的功能,输出了数组的内容。尽管typeof在某些编译器下可能不支持,但在这段代码中两者都成功实现了预期的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 test.cpp

#include<iostream>
#include<type_traits>
using namespace std;
int main(int argc,char* argv[])
{
    float *data = new float[100];
    for(size_t i = 0;i < 100;++i)
        data[i] = i;
    cout<<"1.use decltype"<<endl;
    float af[10];
    auto newD = reinterpret_cast<decltype(af)*> (data);
    for (size_t i = 0;i < 10;++i)
    {
        const auto &[d1,d2,d3,d4,d5,d6,d7,d8,d9,d10] = newD[i];
        cout<<"d1:"<<d1<<"d2:"<<d2<<"d3:"<<d3<<"d4:"<<d4<<"d5:"<<d5;
        cout<<"d6:"<<d6<<"d7:"<<d7<<"d8:"<<d8<<"d9:"<<d9<<"d10:"<<d10<<endl;
    }
    cout<<"-----------------------------"<<endl;
    cout<<"2.use __typeof__()"<<endl;
    auto newd = reinterpret_cast<__typeof__(float[10])*>(data);
    for (size_t i = 0;i < 10;++i)
    {
        const auto &[d1,d2,d3,d4,d5,d6,d7,d8,d9,d10] = newd[i];
        cout<<"d1:"<<d1<<"d2:"<<d2<<"d3:"<<d3<<"d4:"<<d4<<"d5:"<<d5;
        cout<<"d6:"<<d6<<"d7:"<<d7<<"d8:"<<d8<<"d9:"<<d9<<"d10:"<<d10<<endl;
    }
    delete[]  data;
    data = nullptr;
    return 0;
}

 编译

 g++  -o test  test.cpp  

 报警告

加编译参数

g++  -o test  test.cpp   -std=c++1z

运行输出为:

1.use decltype
d1:0d2:1d3:2d4:3d5:4d6:5d7:6d8:7d9:8d10:9
d1:10d2:11d3:12d4:13d5:14d6:15d7:16d8:17d9:18d10:19
d1:20d2:21d3:22d4:23d5:24d6:25d7:26d8:27d9:28d10:29
d1:30d2:31d3:32d4:33d5:34d6:35d7:36d8:37d9:38d10:39
d1:40d2:41d3:42d4:43d5:44d6:45d7:46d8:47d9:48d10:49
d1:50d2:51d3:52d4:53d5:54d6:55d7:56d8:57d9:58d10:59
d1:60d2:61d3:62d4:63d5:64d6:65d7:66d8:67d9:68d10:69
d1:70d2:71d3:72d4:73d5:74d6:75d7:76d8:77d9:78d10:79
d1:80d2:81d3:82d4:83d5:84d6:85d7:86d8:87d9:88d10:89
d1:90d2:91d3:92d4:93d5:94d6:95d7:96d8:97d9:98d10:99
-----------------------------
2.use __typeof__()
d1:0d2:1d3:2d4:3d5:4d6:5d7:6d8:7d9:8d10:9
d1:10d2:11d3:12d4:13d5:14d6:15d7:16d8:17d9:18d10:19
d1:20d2:21d3:22d4:23d5:24d6:25d7:26d8:27d9:28d10:29
d1:30d2:31d3:32d4:33d5:34d6:35d7:36d8:37d9:38d10:39
d1:40d2:41d3:42d4:43d5:44d6:45d7:46d8:47d9:48d10:49
d1:50d2:51d3:52d4:53d5:54d6:55d7:56d8:57d9:58d10:59
d1:60d2:61d3:62d4:63d5:64d6:65d7:66d8:67d9:68d10:69
d1:70d2:71d3:72d4:73d5:74d6:75d7:76d8:77d9:78d10:79
d1:80d2:81d3:82d4:83d5:84d6:85d7:86d8:87d9:88d10:89
d1:90d2:91d3:92d4:93d5:94d6:95d7:96d8:97d9:98d10:99

我的环境使用typeof()编译不过,才改用__typeof__()。见Typeof (Using the GNU Compiler Collection (GCC))

有关typeof()和decltype()的区别见如下链接:

Difference between decltype and typeof? - Stack Overflow

C++ – Difference between decltype and typeof

C++ typeof vs decltype

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值