首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我可以使用带有C++17的std::any作为成员变量的指针吗?

可以使用带有C++17的std::any作为成员变量的指针。C++17引入了std::any,它是一种类型安全的容器,可以存储任意类型的值。使用std::any作为成员变量的指针,可以实现在运行时动态存储不同类型的值。

使用std::any作为成员变量的指针有以下优势:

  1. 灵活性:std::any可以存储任意类型的值,使得代码更加灵活,可以适应不同的数据类型需求。
  2. 类型安全:std::any在编译时会进行类型检查,确保存储的值与指定的类型匹配,避免了类型错误的问题。
  3. 可读性:使用std::any作为成员变量的指针可以提高代码的可读性,因为它明确地表达了该成员变量可以存储任意类型的值。

应用场景:

  1. 插件系统:当需要在运行时加载不同类型的插件时,可以使用std::any作为插件的成员变量指针,以便存储不同类型的插件实例。
  2. 配置管理:当需要动态地管理配置信息时,可以使用std::any作为配置项的成员变量指针,以便存储不同类型的配置值。

腾讯云相关产品推荐: 腾讯云提供了丰富的云计算产品,以下是一些相关产品的介绍链接地址:

  1. 云服务器(CVM):https://cloud.tencent.com/product/cvm
  2. 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  3. 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  4. 人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  5. 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  6. 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  7. 对象存储(COS):https://cloud.tencent.com/product/cos
  8. 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  9. 腾讯云游戏引擎(GSE):https://cloud.tencent.com/product/gse

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【新技术分享】C++17 最新进展

从官方收集与组织了这些信息,没有任何个人主观评论。如果你想知道这次会议主要内容,请阅读下面的内容(已经知道了绝大多数关于C++17内容,但是要将其全部写出来还是需要一定时间) ?...for removing defaults for unary folds C++17库相关文件 P0004R1 弃用过时iostreams别名 P0006R0 采用基于标准库规范类型特征变量模板...核心主题 1274.常见非终结符表达式和内嵌初始化列表 1391.非推导模板参数到参数类型转化 1722.lambda函数指针转换函数应该不例外?...&&不兼容 2052.模板参数推导vs重载操作符 2075.传递短初始化列表给数组引用参数 2101.对类型和值依赖错误说明 2120.数组作为标准布局类第一个非静态成员变量 库主题 1169....n-1个元素 2218.容器如何使用allocator_traits::construct()不够明确 2219.INVOKE-ing一个带有reference_wrapper指针作为对象表达式 2224

1.2K60

c++17好用新特性总结

结构化绑定是指将array、tuple或struct成员绑定到一组变量*上语法,最常用场景是在遍历map/unordered_map时不用再声明一个中间变量了: // pre c++17 for(...mutex_; unsigned int value_ = 0; }; std::string_view std::string_view顾名思义是字符串“视图”,类成员变量包含两个部分:字符串指针和字符串长度...std::any std::any是一个可以存储任何可拷贝类型容器,C语言中通常使用void*实现类似的功能,与void*相比,std::any具有两点优势: std::any更安全:在类型T被转换成...常用于可能失败函数返回值中,比如工厂函数。在C++17之前,往往使用T*作为返回值,如果为nullptr则代表函数失败,否则T*指向了真正返回值。...总结一下,c++17新增三种类型给c++带来了更现代更安全类型系统,它们对应使用场景是: std::any适用于之前使用void*作为通用类型场景。

3.2K10

C++17 在业务代码中最好用十个特性

结构化绑定是指将 array、tuple 或 struct 成员绑定到一组变量*上语法,最常用场景是在遍历 map/unordered_map 时不用再声明一个中间变量了: // pre c++17...在 c++17 之前,只能自己通过独占锁和条件变量自己实现读写锁或使用 c++14 加入性能较差std::shared_timed_mutex。... mutex_;   unsigned int value_ = 0; }; std::string_view std::string_view顾名思义是字符串“视图”,类成员变量包含两个部分:字符串指针和字符串长度...是一个可以存储任何可拷贝类型容器,C 语言中通常使用void*实现类似的功能,与void*相比,std::any具有两点优势: std::any更安全:在类型 T 被转换成void*时,T 类型信息就已经丢失了...总结一下,c++17 新增三种类型给 c++带来了更现代更安全类型系统,它们对应使用场景是: std::any适用于之前使用void*作为通用类型场景。

2.5K20

深入解析C++auto自动类型推导

type that can represent any non-negative value of difference_type”,于是你认为用unsigned类型就可以了,于是写下如下代码: std...非类型模板形参占位符(C++17C++17标准再次拓展了auto功能,使得能够作为非类型模板形参占位符,如下例子: template void func() { std...结构化绑定功能(C++17C++17标准中auto还支持了结构化绑定功能,这个功能有点类似tuple类型tie函数,它可以分解结构化类型数据,把多个变量绑定到结构化对象内部对象上,在没有支持这个功能之前...类内初始化成员时不能使用auto 在C++11标准中已经支持了在类内初始化数据成员,也就是说在定义类时,可以直接在类内声明数据成员地方直接写上它们初始值,但是在这个情况下不能使用auto来声明非静态数据成员...虽然不能支持声明非静态数据成员,但却可以支持声明静态数据成员,在C++17标准之前,使用auto声明静态数据成员需要加上const修饰词,这就给使用上造成了不便,因此在C++17标准中取消了这个限制:

20320

C++中auto关键字用法详解

2.auto使用细则 auto与指针和引用结合起来使用 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须 加& int main() { int x...这意味着你可以在函数定义时使用auto关键字指定返回类型,编译器会根据返回语句推导出具体类型。这样做可以增加代码可读性和灵活性,特别是在模板编程和使用lambda表达式时。...示例: auto genericAdd = [](auto x, auto y) { return x + y; }; C++17中对auto更新 类成员初始化: C++17允许在类中使用auto...关键字来声明成员变量,并通过构造函数列表初始化语法或默认成员初始化器来推导类型。...对于函数模板,如果使用auto来指定参数类型,编译器可以根据传递实参推导出模板参数类型。

26510

CC++开发基础——类模板

第一次使用模板类型声明变量时,会创建类模板一个实例, 以后定义同类型变量时,会使用已经创建第一个实例。 类模板有许多应用,最常见应用是定义容器类。...myArray; 二,类模板成员函数 在类模板模板体中定义成员函数,与普通类一样,成员函数可以看作是所有模板实例内联函数。...但是在模板体外部定义成员函数,语法与普通类不同,需要将成员函数定义为函数模板。 由于成员函数函数模板与它们类模板绑定在一起,所以函数模板使用参数列表必须与类模板参数列表完全相同。...声明指向对象指针并不会创建类模板实例: Array* obj_ptr; //声明了一个指针,不会创建类模板实例 Array str_obj...从C++17开始,也可以指定auto,auto& 和 auto* 等作为非类型参数,编译器会自动推导出类型。

19450

c++lambda使用注意事项,可能导致崩溃问题分析

以上示例崩溃原因都可以归结为使用了悬空引用。需要特别注意悬空引用。 悬空引用 引用捕获会导致闭包包含一个局部变量引用或者一个形参引用(在定义lamda作用域)。...若需要用到外部局部变量,需以值传递方式捕获而非引用捕获(若是外部指针变量则需深拷贝)。 2、谨慎使用或者不用外部指针。...在C++14中,捕获成员变量一种更好方法是使用广义lambda捕获(generalized lambda capture,即,捕获语句可以是表达式[x= x],条款32)。...6、注意捕获是可见(在创建lambda作用域可见)非static局部变量(包含形参)。 每一个非static成员函数都有一个this指针,然后每当你使用成员变量时都用到这个指针。...好在C++17增加了新特性可以捕获*this,不持有this指针,而是持有对象拷贝,这样生命周期就与对象生命周期不相关,使用上就安全一些。

3.8K10

每个开发者都应该了解一些C++特性

这个特性也是 C++11 中新加入。 记住,当使用 auto 时,必须确保你编译器可以通过某种方式推断数据类型。 现在问题来了,如果写 auto a = {1, 2, 3} 会发生什么?...会有编译错误?这是向量? 实际上,C++11 引入了 std::initializer_list,如果声明为 auto,那么初始化列表会被认为是这种轻量级容器。...这里使用方括号[]作为 lambda 表达式开始。它定义了 lambda 函数作用域,即它对局部变量和对象有多少权限。 下面是一些现代 c++中相关定义: []代表空。...因此你不可以在 lambda 表达式中使用任何外部作用域局部变量。只可以使用参数。 [=]代表可通过值获取作用域内局部对象(局部变量和参数),即你只可以使用但不可修改。...假设你有一些表达式要计算,并且它值一旦初始化就不会改变。你可以预先计算该值并且作为宏来使用。或者像 C++11 中提供,你可以使用 constexpr。 编程人员倾向于尽可能减少程序运行时间。

75620

C++避坑---函数参数求值顺序和使用独立语句将newed对象存储于智能指针

newed对象与智能指针 我们使用《 Effective C++》中例子,假设有两个函数priority和processWight,其对应原型如下: int priority(); void processWidget...调用shared_ptr构造函数(使用Widget对象指针作为构造参数)。 调用priority函数。...解决这样问题办法也很简单,就是使用分离语句,将std::shared_ptr(new Widget())拎出来,在单独语句中执行new Widget()表达式和shared_ptr<...C++17带来好消息 在上一章节中,我们提到processWidget(std::shared_ptr(new Widget()), priority());语句可能带来内存泄漏风险...总 结 虽然C++17已经能够规避到我们上面讨论过风险,但是考虑到我们代码普适性,仍建议我们:使用独立语句将newed对象存储于智能指针中,来保证“资源被创建”和“资源被管理对象接管”之间不会发生任何干扰

50810

std::any 解决类型不确定性利器

背景 C++是一种强类型语言。要求变量和表达式类型在编译时必须能够确定。但是也经常会遇到需要处理不确定类型情况。...如函数需要可以接受任意类型参数,或者在一个容器中存储各种类型对象,以往可以通过指针和模板来解决,但是这些方法存在代码冗长、可读性差等问题。...而 C++17 引入 std::any 类模板则提供了一种更加优雅和方便解决方案。如下示例代码展示了在vector中存储不同类型值。...注意 std::any在进行any_cast转换时,如果类型不匹配会触发异常,在进行any_cast转换前,需要先判断是否存在指定类型值,存在使用指针使用typeid两种方法,见示例代码。...std::any含有的值必须是可拷贝,否则会编译报错。 std::any作为类模板可以存在任意类型,提供了使用便利性,但其具有内存占用大弊端。经测试any占用40个字节,是int10倍。

6610

C++17中新特性

C++17中,可以捕获this, this是当前对象一个拷贝,捕获当前对象拷贝,能够确保当前对象释放后, lambda表达式能安全调用this中变量和方法。...,值不存在时则抛出 std::bad_optional_access 异常 value_or() // 值存在时返回值,不存在时返回默认值 3. std::any 一个类型安全可以保存任何值容器...4. std::string_view string_view最早使用是boost版本c++17string_view 和 boost类似。...在很多情况下,我们只是临时处理字符串,本不需要对原始字符串一份拷贝。 使用string_view可以减少不必要内存拷贝,可以提高程序性能。...相比使用字符串指针,string_view做了更好封装。 需要注意是,string_view 由于没有原始字符串所有权,使用string_view 一定要注意原始字符串生命周期。

4.9K30

C++17,标准库有哪些新变化?

(strView变量), 而第16行代码中创建 std::string_view(strView2变量) 引用则是字符数组.在第9行代码中,我们通过组合使用 remove_prefix 和 find_first_not_of...功能非常强大,你可以使用他来递归遍历某个目录,当然,你也可以使用 fs::remove_all 来删除某个目录(第27行)....,那么你就应该使用std::any,不过确切来说的话,std::any 并不是对任意类型都提供存储支持,只有可复制类型才能存放入 std::any.下面列一段简短示例代码: #include <iostream...::get(v) 来获取该值.第9行到11行代码中,使用了3种方式将v中数值赋值给了w. std::variants 使用自然也有一定规则限制,你可以使用指定某一类型(第9行代码)或者指定某一索引...25行代码中可以使用C风格字符串直接初始化(或者赋值) std::variantstd::string 原因.

1.2K10

C++17, 语言核心层变化更多细节

看到一个介绍 C++17 系列博文(原文),有十来篇样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第三篇~ 在之前文章中介绍了一些C++17语言核心层变化,这次我会介绍更多相关细节,涉及主题有...现在你可以声明内联全局变量和静态变量了,相关规则限制和内联函数是一致....这意味着: 你可以重复定义一个内联变量,但是该内联变量必须在使用到他编译单元中可见.一个全局内联变量(即非静态内联变量)必须在每一个编译单元中进行声明并且该全局内联变量在每一个编译单元中都有相同内存地址...C++17 更改了 auto 结合使用 列表初始化 规则. auto 结合使用 {}-Initialisation C++17之前,如果你结合使用 auto 和 列表初始化,你会得到一个 std::initializer_list...[[maybe_unused]]地方很多:类,typedef,变量,非静态成员变量,函数,枚举类型或者枚举值.

72710

第七章 函数

包含零个形参时,可以使用void标记 对于非模板函数来说,其每个形参都有确定类型,但形参可以没有名称 形参名称变化并不会引入函数不同版本 实参到形参拷贝求值顺序不定,C++17强制...fun(1, 2); // 拷贝求值顺序不定 fun(1, int{}); // 临时变量会被C++17标准强制忽略,C++17标准之前由编译器决定 } -fno-elide-constructors...,可以为void 返回类型几种书写方法 经典方法:位于函数头前部 C++11引入方式:位于函数头后部(泛型编程和类成员函数编写可能会简化编写) C++14引入方式...:返回类型自动推导 使用constexpr if构造“具有不同返回类型”函数,接收常量表达式 返回类型与结构化绑定(C++17)语法糖 [[nodiscard...constexpr函数 函数指针 函数类型与函数指针类型 函数指针 高阶函数 函数指针与重载 将函数指针作为函数参数 将函数指针作为函数返回值

17530

C++避坑---关键字static使用及注意事项

(函数调用开始,到程序执行完成时结束) 默认情况下,局部变量(定义在函数内部变量作用域仅限于函数内部,只有函数被调用时候才被初始化(存储于栈空间)和使用,函数执行完毕时候被释放,而被static...static在类中常用使用场景主要有: 修饰类数据成员:即静态成员,该成员不关联到任何对象,即使不定义该类任何对象它也存在,其生存周期大于该类对象,其作为成员,由该类所有对象共同访问。...调用时,它们没有this指针。静态成员函数不能是virtual、const 或volatile 。静态成员函数地址可以存储在常规函数指针中,但不能存储在成员函数指针中。...void (*psf)() = &X::sf; // 静态成员函数地址可以存储在常规函数指针中 (x..../*【注:C++17起,inline 静态数据成员可以在类定义中定义 (即inline static int s_sum_ = 0;), 而且可以指定初始化器

51110

C++可调用Callable类型总结

同时, 对于成员函数指针和数据成员指针, t1 可以是一个常规指针或一个重载了 operator* 对象, 例如智能指针 std::unique_ptr 或 std::shared_ptr....但是函数对象本质上还是一个 class 具体化 object, 里面是可以附带一些成员变量(可以理解为函数对象状态(state)), 这就让函数对象应用场景比函数指针更广阔....类也可以使用时候动态再产生, 节省成本....既然是类, 那就有它限制, 例如要注意, 如同其他所有对象(狭义上对象, 感觉内置类型其实也可以被叫对象, 按场景区分吧)一样, 如果 pass-by-value 化, 对象里成员变量是被复制进去...// a被修改了 std::cout << f() << std::endl; // 输出依旧为0,如果想要跟着被改变需要使用引用捕获 2. lambda 表达式转换成函数指针没有捕获变量 lambda

25420

C++17, 语言核心层有哪些新变化?

猜你已经看出了其中命名模式: 今年(2017)晚些时候,我们便会迎来新C++标准(C++17). 今年3月份, C++17已经达到了标准草案阶段....cout << std::endl; return 0; } 上述代码中(第6行)使用二元运算符是逻辑与(&&).程序输出如下: 对于折叠表达式想说就是这些,如果你想了解更多细节,可以看看我之前一篇关于折叠表达式文章...(结构化绑定声明) 借助结构化绑定,我们可以直接将 std::tuple 或者某个结构元素绑定到变量上去,让我们用结构化绑定声明来改写一下之前示例代码: std::map<int, std::string...(译注:意为 std::auto_ptr 复制(和赋值)操作会改变源操作数内部数据,因此其不能进行逻辑独立复制(和赋值)操作,也是因为这个原因, std::auto_ptr 不能作为标准库容器元素...).正因为 std::auto_ptr 这个缺陷, C++11 中作为替代引入了不可复制(只可移动) std::unique_ptr. std::auto_ptr ap1(new int(

80320

Modern C++,学炸了!!

本文思维导图 一、方法论 作为写了十多年 C++ 过来人,想说是,会写 C++ 是一回事,写好 C++ 则是另外一回事。...关于C++ Modern 智能指针可以参考这里《Modern C++ 智能指针详解》。...: //右边**expression**可以是一个函数调用、花括号表达式或者支持结构化绑定某个类型变量。...各种技巧和避坑指南书《Effective Modern C++》,这本书也不错,推荐一下: 五、常用编译器对 C++11/14/17 支持情况 目前公司项目也全部使用 C++17 开发,对于...网络库 uWebSocket 是一款开源 WebSocket 库,最新版使用了大量 C++17 语法,美中不足是这个库代码存在不少 bug,在项目中使用了它,但修改了其大量 bug,有兴趣朋友也可以下载下来看一下

3.1K10
领券