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

存储任意引用的 C++ 包装类,但本身不是类模板

存储任意引用的 C++ 包装类,但本身不是类模板,可以使用 C++ 的模板特化和类型擦除技术来实现。

首先,我们需要定义一个包装类,该类将存储任意类型的引用,但本身不是类模板。我们可以使用 std::any 类型来实现这个功能。

代码语言:cpp
复制
#include <any>

class AnyRefWrapper {
public:
    template<typename T>
    AnyRefWrapper(T& ref) : m_ref(std::ref(ref)) {}

    void* get_address() const {
        return &(std::any_cast<std::reference_wrapper<void>>(m_ref).get());
    }

private:
    std::any m_ref;
};

在上面的代码中,我们使用了 std::any 类型来存储任意类型的引用。我们还定义了一个 get_address() 方法,该方法返回引用的地址。

接下来,我们可以使用这个包装类来存储任意类型的引用。

代码语言:cpp
复制
int main() {
    int a = 42;
    std::string b = "hello";

    AnyRefWrapper wrapper_a(a);
    AnyRefWrapper wrapper_b(b);

    std::cout << "Address of a: "<< wrapper_a.get_address()<< std::endl;
    std::cout << "Address of b: "<< wrapper_b.get_address()<< std::endl;

    return 0;
}

在上面的代码中,我们创建了两个 AnyRefWrapper 对象,一个用于存储 int 类型的引用,另一个用于存储 std::string 类型的引用。我们可以使用 get_address() 方法获取这些引用的地址。

需要注意的是,由于我们使用了 std::any 类型来存储引用,因此在使用 get_address() 方法时需要小心,因为如果 std::any 中存储的不是引用类型,那么 get_address() 方法将返回无效的地址。

总之,我们可以使用 C++ 的模板特化和类型擦除技术来实现一个存储任意引用的 C++ 包装类,但本身不是类模板。

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

相关·内容

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点讲解 1.统一列表初始化 1.1{}初始化...那么如果右值引用本身还是右值,不能被改变,那还怎么进行资源转移 const 右值 ,右值引用后不能改变 万能引用是 C++11 中引入一种引用类型,用于实现泛型编程时处理模板类型参数值类别...模板参数包允许在模板参数列表中接受任意数量参数,并通过展开(expansion)来处理这些参数。...在C++中,std::function是一个通用函数包装器,它可以用来存储、复制和调用任何可调用对象,包括函数指针、函数对象、Lambda表达式等。...C++function本质是一个模板,function可以封装他们,目标是统一型,统一后我们能传给各种容器使用,函数指针的话类型复杂、仿函数类型不同、Lambda表达式没有类型。

10700

C++】C++11 新特性

(STL 中所有容器都重载了参数类型为 initializer_list 构造和赋值函数,但是不包括容器适配器,因为容器适配器本身不是一个容器,其只是对容器封装) ---- 四、变量类型推导 1、...,它配合 auto 可以让我们很方便让我们取出容器中每一个元素;范围 for 本身并没有什么技术含量,它底层实际上是通过替换成迭代器来完成,所以支持迭代器容器就支持范围 for 遍历;如下:...---- 十一、可变参数模板 1、可变参数模板语法 在C语言中我们使用 … 来表示可变参数,比如 printf 和 scanf 函数,C++ 中沿用了这个用法: 可变参数模板形式 C++ 也与...C语言有一些不同,下面是一个基本可变参数函数模板: // Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数包中可以包含0到任意模板参数。...::plusd; cout << func5(&Plus(), 1, 2) << endl; 其实不是的,因为 this 指针并不能显式传递,同时,function 包装器也是通过对象来调用函数

1.4K10
  • C++】C++11新特性——可变参数模版、lambda、包装

    一、可变参数模版 C语言中有可变函数参数,比如我们熟悉printf和scanf: C++中有时候模版也需要可变参数,C++11新特性可变参数模板可以接受可变参数函数模板模板,而C++11...Args...args,这个参数包中可以包含0到任意模板参数 这里可变指的是参数类型是任意,参数个数也是任意 这意味着我们可以像下面这样使用: template ...lambda表达式类型没有名称,我们通常无法直接引用它,但可以使用auto关键字来存储lambda表达式实例。...模板参数说明: Ret: 被调用函数返回类型 Args…:被调用函数形参 function包装器也叫作适配器。C++function本质是一个模板,也是一个包装器。...,需要指定域 非静态成员函数取函数指针时要+&符号,静态成员函数可以不加,建议还是都加上 上面的包装有错误,你能发现吗?

    12210

    【笔记】C++面向对象高级编程

    返回引用是为了方便接收者按照任意喜欢形式处理返回值. friend是private所有者声明, 声明允许访问private另一个/函数...., 本质是指针但是被完全包装为了原本对象样子 引用必须在声明时候初始化 引用不允许后期改变值, 一旦定义就无法修改指向 引用和range-for很搭, 可用来轻松修改容器元素 引用最常用于函数参数上...模板参数标注类型可以用class也可以用typename, 建议使用typename防止歧义 C++对象模型 不管是复合还是继承, 都是从内到外构造, 从外到内析构....因此我们说多态继承时候是继承了函数调用权而不是函数本身空间 虚指针指向虚函数表, 虚函数表按照目标中函数声明顺序对函数地址指针进行排列, 函数指针指向代码段中函数代码位置 对象函数调用分为静态绑定和动态绑定两种...但是当对象不是const时, 访问数据时候就需要拷贝一份然后返回引用以供外部安全修改了. new和delete new和delete本身是表达式, 其本身行为是无法修改: new: 先调用operator

    90930

    比较分析C++、Java、Python、R语言面向对象特征,这些特征如何实现?有什么相同点?

    C++本身不是对象,对象是实例化; (4)  基于模型,还是基于对象或原型模型?...C++是基于模型 对象模型:继承 (1)  层次结构:采用单根层次结构,还是任意层次结构? C++采用任意层次结构; (2)  继承方式:提供哪些继承方式?...(1)  类属:虚函数 用父指针指向其子类实例,然后通过父指针调用实际子类成员函数,这种技术可以让父指针有“多种形态”; (2)  类属:模板函数 模板C++支持参数化多态工具,使用模板可以使用户为或者函数声明一种一般模式...C++采用是值模型,可以创建静态对象或栈对象; 只有通过对象引用或指向对象指针才能实现面向对象动态约束行为。...参数传递:通过动态束定机制 类属:通过Self指代对象本身 Python语言不是“纯粹”面向对象语言: 1)  存在全局变量和全局函数; 2)  main函数不是方法; 3)  Python一切皆对象

    1.7K10

    【Example】C++ 回调函数及 std::function 与 std::bind

    作用是对C++可调用对象进行包装,例如普通函数、成员函数、模板函数、静态函数、lambda表达式等。 它最基本作用是,简化调用复杂程度,统一调用方式。...它与 std::function 不同是,function 是模板,bind 是模板函数,而 bind 返回可调用对象可以直接给 function 进行包装并保存。...为什么要进行“包装”与“转发”呢? 首先,不规范解释是,function 作用是包装,它可以包装成员函数,但却无法生成成员函数可调用对象。而 std::bind 则是可以生成。...当用作成员函数绑定时,第一个参数仍然是作为成员可调用对象引用,第二个参数则是对象指针,而第三个参数开始对应可调用对象参数表。...2,到 bind 参数被复制或移动,而且决不按引用传递,除非包装于 std::ref 或 std::cref 。

    4.8K30

    C++】深入剖析C++11新特性

    ---- 九、可变参数模版 C++11新特性可变参数模板能够让您创建可以接受可变参数函数模板模板,相比C++98/03,模版和函数模版中只能含固定数量模版参数,可变模版参数无疑是一个巨大改进...C++function本质是一个模板,也是一个包装器 那么我们来看看,我们为什么需要function呢?...A)包装器function原型: std::function在头文件 // 模板原型如下 template function; // undefined template...包装包装成员函数时候,非静态函数第一个参数需要传名,在赋值时候需要带上域,函数需要取地址,静态函数只需要在赋值时候需要带上域(这里建议都取地址,方便记忆)。...在使用包装成员函数包装时候,我们第一个参数也要传一个对象。

    44040

    SWIG 官方文档第二部分 - 机翻中文人肉修正

    7.3.7 包装参考 包装引用类似于普通 C++ 引用,但它是可复制构造和可复制赋值。可以想象,它们可以用于公共 API。...尽管 SWIG 中没有对 std::reference_wrapper 特殊支持。如果使用包装引用,用户将需要编写自己类型映射,这些类似于普通 C++ 引用类型映射。...例如,由于 SWIG 需要通过%template显式实例化模板,因此std::is_integral本身不会提供太多内容。但是,使用这种元编程技术模板函数可能对包装很有用。...这些类型映射覆盖默认类型映射,以便存储底层代理并将其作为指向 shared_ptr 指针传递而不是指向基础类型普通指针。...%shared_ptr 宏引入唯一真正变化是代理存储了一个指向 shared_ptr 实例指针,而不是一个指向该实例原始指针。

    2.2K20

    【Example】C++ Template (模板)概念讲解及编译避坑

    引用 Microsoft Docs: 模板是 c + + 中泛型编程基础。 作为强类型语言,c + + 要求所有变量都具有特定类型,由程序员显式声明或由编译器推断。...总结:模板C++ 当中支持参数类型与返回值动态化工具,使开发人员可以动态自定义函数、中参数与返回值类型。 模板又分为两种:函数模板模板。...2,模板 函数模板很好理解,那么模板是什么呢? 可以在模板内部或外部定义成员函数。 如果在模板外部定义成员函数,则会像定义函数模板一样定义它们。...然后:模板当中非类型形参 这是一个什么东西呢? 1,它是一个常量。 2,它类型只能是 int 、指针、引用这三种内置类型。 3,调用它只能是一个常量表达式。 它使用场景?...而 C++ 每一个变量及对象占用空间在编译时候就要被确定! 所以 C++ 当中没有绝对泛型编程概念。 因此,模板必须是声明与实现同源(不一定是文件不分离),最合适写法也就是 hpp 文件。

    72820

    【C++11】解锁C++11新纪元:深入探索Lambda表达式奥秘

    可变参数模板 可变参数模板是C++11中引入一种非常有用语言特性,它允许函数或模板接受可变数量参数。...这一特性极大地增加了模板灵活性和扩展性,使得开发者可以定义更加通用和灵活函数或模板 C++11新特性可变参数模板能够让您创建可以接受可变参数函数模板模板,相比C++98/03,模版和函数模版中只能含固定数量模版参数...,这个参数包中可以包含0到任意模板参数。...C++function本质是一个模板,也是一个包装器 template T useF(F f, T x) { return f(x); } double...C++11中lambda表达式和包装器是C++发展史上一个重要里程碑。

    8010

    C++11

    结果是报错,因为万能引用前提,模版参数是需进行推导,而不是要用来进行实例化。...改正: ,再加一个模版参数,进行推导是左值引用还是右值引用,而不是用原来进行实例化模版参数 8 新功能 强制生成 默认成员函数 原来C++中,有6个默认成员函数: 1. 构造函数 2....下面就是一个基本可变参数函数模板 // Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数包中可以包含0到任意模板参数。...11 包装器function function包装器 function包装器 也叫作适配器。C++function本质是一个模板,也是一个包装器。...一定要加&Plus 有了包装器,如何解决模板效率低下,实例化多份问题呢?

    13810

    C++】C++11常用特性总结

    如果是右值拷贝或赋值呢?因为拷贝构造和拷贝赋值参数是const左值引用,自然可以接收右值传参,在函数内部必然还是要进行资源重新拷贝,那是不是有点太浪费了啊?...,因为他们其实各自有一块空间用来存储右值,rr2是不能被修改,因为rr2在引用时带有const属性。...C++觉得C语言函数指针太恶心了,C++进而就搞出来仿函数对象,仿函数实际是一个重载了operator()一个,比如下面进行排序场景,调用库sort时,sort函数模板第三个参数缺省值就是...C++新引入了可变参数模板语法,即函数参数可为一个参数包,这个参数包中可以包含任意个数函数形参,想打印出参数包中参数个数,可以通过sizeof…()函数取到参数包中参数个数。 2....像下面这样命令和动作对应场景,其实就可以用包装器,让包装包装lambda,然后把string和包装器对象构成键值对存储到map里面,建立命令和动作映射关系。

    81140

    c++模板与泛型编程

    最近复习下c++模板,在这里简单记录先个人对泛型编程和模板理解,主要针对模板目标,原理以及场景做分析,欢迎站内大佬做指导和补充。...泛型编程与模板设计目标 泛型编程目标是编写可重用代码,而在c++中泛型编程工具就是模板。普通函数参数化值,可以编写不依赖特定值算法;模板参数化类型,可以编写不依赖特定类型函数和。...包装 包装实现方式就比较多种多样了,没有特定套路,针对不同问题场景有不同应用。这里尝试列出标准库中常用实现供参考,自己编写代码时也可以借鉴这里思路。...感觉这句话很适合对包装描述。 智能指针 利用变量生存期进行动态对象管理和释放。...- 场景2:在vector中存储数据引用。在向vector中正常添加数据时,是对原始数据复制或移动,包括动态扩容时复制或移动操作,都会导致无法访问原始数据。

    88320

    SWIG 官方文档第三部分 - 机翻中文人肉修正

    由于类型映射与底层 C++ 类型系统紧密相关,因此后续部分假设您相当熟悉值、指针、引用、数组、类型限定符(例如,const)、结构、命名空间、模板和内存管理基本细节在 C/C++ 中。...%extend 用于将新声明附加到或结构定义。因此,%extend 块中所有声明都受在定义本身时生效类型映射规则约束。...更准确地说,这些规则基于 C++ 编译器在寻找合适部分模板特化时使用 C++ 模板部分特化匹配规则。这意味着匹配是从可用最专业通用类型映射类型集中选择。...考虑两个方面首先是默认类型映射及其与部分模板专业化相似性,其次是非默认类型映射及其与完整模板专业化相似性。 对于默认 (SWIGTYPE) 类型映射,规则受 C++ 模板部分特化启发。...注意由于“bigframent”为空(空字符串-“”),所以不加任何代码本身仅触发其他片段包含。 6.

    3.6K30

    多重收纳(模板C++

    为了能够包装不同类型元素,我们决定用模板来实现这种盒子,并起名为CBox. 然而,我们注意到CBox、CBox等虽然定义自相同模板实际上它们是不相容类型。...b)如果包装值是非空指针,那么一般来说打印指针值是没有什么价值,我们更关注是指针所指向内容。 我们希望能够对T*这样模板参数类型定义不同处理方式。...通过进一步学习可以了解到c++支持"模板偏特化"方法: template class CC { ...... }; template class CC<...为CBox模板定义适合以原生指针作为模板参数特化版本     由于定义成员变量为指针类型,且同一对象被new出来后可能被赋予多个所有者,     为了简化编程,本题不考虑析构函数(使用默认即可)...就是为了对于特定类型来执行不同代码,而不是去调用通用模板

    18730

    模板进阶:特化与编译链接全解析

    [C++] 模版初阶-CSDN博客 非类型模板参数 非类型模板参数,就是用一个常量作为(函数)模板一个参数,在(函数)模板中可将该参数当成常量来使用,定义方法如下: template<class...示例 假设我们有一个通用数据存储模板Data,它可以存储两个不同类型对象: template class Data { public:...,可以存储任意类型两个数据。...:调用了全特化模板,因为参数类型既不是指针也不是引用。...因此,Date* const& 意思是“指向Date对象常量指针引用”。这个引用在函数内不会改变其所引用指针对象,也不能通过引用修改指针本身指向。 已经特化中T表示为什么?

    15710

    Java中堆(heap)和栈(stack)区别

    这种类型定义是通过诸如int a = 3; long b = 255L;形式来定义,称为自动变量。值得注意是,自动变量存是字面值,不是实例,即不是引用,这里并没有存在。...这些数据全部存在于堆中,Java用new()语句来显式地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,缺点是要占用更多时间。 4. String是一个特殊包装数据。...数据类型包装值不可修改。不仅仅是String值不可修改,所有的数据类型包装都不能更改其内部值。 7....(3) 当比较包装里面的数值是否相等时,用equals()方法;当测试两个包装引用是否指向同一个对象时,用==。   ...GC将它们从一个堆块中移到另外一个堆块中,并 将它们一个挨一个排列起来,就象我们上面说那样,模拟出了一个栈结构,但又不是先进后出分配,而是可以任意分配,在速度可以保证情况下。

    1.9K51

    C++ 模板元编程简介

    C++模板C++提供了元编程能力,大部分用户对 C++ 模板使用并不是很频繁,大致限于泛型编程,在一些系统级代码,尤其是对通用性、性能要求极高基础库(如 STL、Boost)几乎不可避免在大量地使用...2.模板元编程作用 C++ 模板最初是为实现泛型编程设计人们发现模板能力远远不止于那些设计功能。...C++ 模板元编程是“意外”功能,而不是设计功能,这也是 C++ 模板元编程语法丑陋根源。...其中负载可以分为两,一就是程序运行本身开销,一则是程序员需要编写代码。前者可以理解为编译时优化,后者则是为提高代码复用度,从而提高程序员编程效率。...vector;)分配器(这个参数有默认参数,即默认存储策略),策略模板经常变化那一部分子功能块集中起来作为模板参数,这样模板便可以更为通用,这和特性思想是类似的。

    6.9K42

    C++】C++11中常见语法(下)

    C++11 一、可变参数模板 C++11 新特性可变参数模板能够让我们创建可以接受可变参数函数模板模板,相比 C++98/03 ,模版和函数模版中只能含固定数量模版参数,可变模版参数是一个巨大改进...以下是可变参数模板语法: // Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数包中可以包含0到任意模板参数。...三、包装器 1. function 包装器 function 包装器 也叫作适配器,C++ function 本质是一个模板,也是一个包装器。 要学包装器,首先需要知道包装包装是什么?...其实包装包装是可调用对象,目前我们学习到可调用对象有:函数指针、仿函数、lambda,我们要学包装器就是要包装它们三个中任意一个。...我们先来看看 function 包装语法: // 模板原型如下 template <class Ret, class...

    10110

    C++】————C++11

    ,表明变量是局部自动存储类型,但是局部域中定义局部变量默认就是自动存储类型,所以auto就没什么价值了。...可变参数模板   C++11新特性可变参数模板能够让您创建可以接受可变参数函数模板模板,相比C++98/03,模版和函数模版中只能含固定数量模版参数,可变模版参数无疑是一个巨大改进。...// Args是一个模板参数包,args是一个函数形参参数包 // 声明一个参数包Args...args,这个参数包中可以包含0到任意模板参数。...包装器 function包装器   function包装器也叫作适配器。C++function本质是一个模板,也是一个包装器。...bind   std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器,接受一个可调用对象,生成一个新可调用对象来“适应”原对象参数列表。

    5910
    领券