c++17中的any、for_each、and_eq

c++17中的any、for_each、and_eq

描述

类 any 描述用于任何类型的单个值的类型安全容器。

  1. 类 any 的对象存储任何满足构造函数要求的类型的一个实例或为空,而这被称为 any 类对象的状态。存储的实例被称作所含对象。若两个状态均为空,或均为非空且其所含对象等价,则两个状态等价。
  2. 非成员 any_cast 函数提供对所含对象的类型安全访问。
    鼓励实现避免小对象的动态分配,但这种优化仅可以应用于 std::is_nothrow_move_constructible 对其返回 true 的类型。

代码

#include <any>
#include <iostream>
#include <bitset>
#include <vector>
#include <algorithm>

int main()
{
    std::cout << std::boolalpha;

    std::bitset<5> mask("11001");
    std::bitset<5> val("01111");
    std::any amask = mask;
    std::any aval = val;
    val and_eq mask; // and_eq is &=, and is &&
    std::cout << "bitset:\t" << val << "\n";

    // any
    std::any var = 1;
    std::cout << var.type().name() << ":\t" << std::any_cast<int>(var) << '\n';
    var = 2.2;
    std::cout << var.type().name() << ":\t" << std::any_cast<double>(var) << '\n';
    var = 3.3f;
    std::cout << var.type().name() << ":\t" << std::any_cast<float>(var) << '\n';
    var = true;
    std::cout << var.type().name() << ":\t" << std::any_cast<bool>(var) << '\n';
    var = mask;
    std::cout << var.type().name() << ":\t" << std::any_cast<std::bitset<5>>(var) << '\n';
    // 转换
    try
    {
        var = 4L;
        std::cout << std::any_cast<float>(var) << '\n';
    }
    catch (const std::bad_any_cast& e)
    {
        std::cout << "error:\t" << e.what() << '\n';
    }
    // 判断是否有值
    var = 5.5f;
    if (var.has_value())
    {
        std::cout << var.type().name() << '\n';
    }
    // 清空
    var.reset();
    if (!var.has_value())
    {
        std::cout << "has value:\t" << "no value\n";
    }
    // 直接构造
    var.emplace<std::vector<char>>({ 'C', '+', '+', '1', '7', '\0'});
    std::cout << var.type().name() << ":\t" << std::any_cast<std::vector<char>>(var).data() << '\n';
    // foreach
    const std::vector<char>* cpv = std::any_cast<std::vector<char>>(&var);
    std::cout << "for_each:\t";
    std::for_each(cpv->cbegin(), cpv->cend(), [](char const& c) { std::cout << c; });
    std::cout << '\n';
    // 指针
    var = 6;
    int* i = std::any_cast<int>(&var);
    std::cout << "point:\t" << *i << "\n";
    return 0;
}

输出

bitset: 01001
int:    1
double: 2.2
float:  3.3
bool:   true
class std::bitset<5>:   11001
error:  Bad any_cast
float
has value:      no value
class std::vector<char,class std::allocator<char> >:    C++17
for_each:       C++17
point:  6

参考

https://zh.cppreference.com/w/cpp/utility/any

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值