C++之std::monostate应用实例(二百二十一)

本文介绍了C++中的std::monostate作为标记类型和占位类型的使用,以及std::variant如何处理不同可能的数据类型。通过实例展示了如何在函数签名和variant中运用这些概念。

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

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之std::monostate应用实例。

在C++中,std::monostate是一种特殊类型,主要用于作为标记类型(tag type)或占位类型(placeholder type)。它被设计为一个不占用任何空间的类型,用于表示“不包含实际数据”的状态。

std::monostate类型通常在函数签名中作为占位符,用于表示某个函数不接受任何参数或不返回任何数据。例如,可以将其作为一个函数的返回类型,来指示该函数没有实际的返回值。

2.应用实例

#include <iostream>
#include <variant>

std::variant<int, std::monostate> getInteger(bool condition) {
  if (condition) {
    return 42;
  } else {
    return std::monostate{};
  }
}

using Elem = std::variant<
                std::monostate,               // 占位符
                int32_t,                      // Int32
                int64_t,                      // Int64
                double,                       // Double
                std::string,                  // string
                std::pair<int64_t, int64_t>   // pair
                >;


void process(Elem &data){
  if (std::holds_alternative<int32_t>(data)) {
    int32_t value = std::get<int32_t>(data);
    std::cout << "Integer value: " << value << std::endl;
  } else if (std::holds_alternative<int64_t>(data)) {
    int64_t value = std::get<int64_t>(data);
    std::cout << "Long value: " << value << std::endl;
  } else if (std::holds_alternative<double>(data)) {
    double value = std::get<double>(data);
    std::cout << "Double value: " << value << std::endl;
  } else if (std::holds_alternative<std::string>(data)) {
    std::string value = std::get<std::string>(data);
    std::cout << "String value: " << value << std::endl;
  } else if (std::holds_alternative<std::pair<int64_t, int64_t>>(data)) {
    auto value = std::get<std::pair<int64_t, int64_t>>(data);
    std::cout << "Rate value: " << value.first << "/" << value.second << std::endl;
  } else {
    std::cout << "No data." << std::endl;
  }
}


int main() {
  Elem melem;

  Elem data1 = std::monostate{};
  Elem data2 = 42;
  Elem data3 = 3.14;
  Elem data4 = "Hello, world!";
  Elem data5 = std::make_pair(10, 3);

  process(data1);  // No data.
  process(data2);  // Integer value: 42
  process(data3);  // Double value: 3.14
  process(data4);  // String value: Hello, world!
  process(data5);  // Rate value: 10/3

  return 0;
}

打印
No data.
Integer value: 42
Double value: 3.14
String value: Hello, world!
Rate value: 10/3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值