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

在将指向数据成员的指针作为非类型模板参数传递时推断类型和类

在将指向数据成员的指针作为非类型模板参数传递时,推断类型和类是指在模板参数中使用指向数据成员的指针,并且需要根据传入的指针来推断出指针所指向的数据类型和所属的类。

在C++中,可以使用模板元编程技术来实现这一功能。模板元编程是一种在编译期间进行计算和推断的技术,通过使用模板特化和模板偏特化等技术,可以根据传入的指针类型来推断出数据类型和类。

下面是一个示例代码,演示了如何在模板参数中传递指向数据成员的指针,并推断出类型和类:

代码语言:txt
复制
#include <iostream>

template <typename T, T ptr>
struct DataMemberPointer {
    using Type = T;
    using Class = typename std::remove_pointer<decltype(ptr)>::type;
};

struct MyClass {
    int data;
};

int main() {
    int MyClass::* ptr = &MyClass::data;
    using Result = DataMemberPointer<decltype(ptr), ptr>;

    std::cout << "Type: " << typeid(Result::Type).name() << std::endl;
    std::cout << "Class: " << typeid(Result::Class).name() << std::endl;

    return 0;
}

在上面的代码中,我们定义了一个模板结构体 DataMemberPointer,它有两个成员类型 TypeClass,分别用于存储推断出的数据类型和类。在 main 函数中,我们定义了一个指向 MyClass 类的 data 成员的指针 ptr,然后使用 DataMemberPointer 模板来推断出类型和类,并输出结果。

运行上面的代码,输出结果如下:

代码语言:txt
复制
Type: int
Class: MyClass

可以看到,我们成功地通过模板参数推断出了指针所指向的数据类型和所属的类。

在云计算领域中,这种技术可以应用于各种场景,例如在云原生应用开发中,可以使用模板元编程来根据传入的指针类型来推断出相关的数据类型和类,从而实现更加灵活和通用的代码设计和开发。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云原生服务:https://cloud.tencent.com/product/tke
  • 腾讯云函数计算:https://cloud.tencent.com/product/scf
  • 腾讯云容器服务:https://cloud.tencent.com/product/ccs
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储:https://cloud.tencent.com/product/cos
  • 腾讯云区块链:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/tc3
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【笔记】《C++Primer》—— 第16章:模板与泛编程

第二部分中介绍一些标准库容器我们称其为泛容器,因为它们可以利用了模板特性能对各种符合要求类型进行处理,可以独立于任何类型运行 模板是泛编程基础,一个模板就是创建或函数蓝图或者公式,当我们在编译提供了足够参数模板就会转换为特定或函数...当我们调用函数模板,编译器以前一样可以自动按照我们实参来推断模板参数类型,如果想要指定类型使用泛容器一样函数名后用尖括号标明所需要具体类型T即可。...,非类型参数表示是一个值而不是类型,因此非类型参数在编译时会被用户提供或编译器推断一个常量代替,从而允许我们初始化数组之类 非类型参数可以是整型或指向对象或函数指针或左值引用,但是注意绑定到非类型整型必须是常量表达式...类型别名我们会将整个模板作为一个别名,其中我们可以一些参数固定住 // 模板参数别名 template using shortTemp...模板名字可能是一个数据成员也可能是一个类型成员,默认情况下C++假定作用域运算符访问名字不是类型,如果我们希望它是类型则需要在前面加typename标识 C11允许我们为函数模板模板提供默认参数

1.5K30

第 16 章 模板与泛编程

因为编译器需要在编译实例化模板,此时非类型参数会被一个用户提供或编译器推断值所代替,所以这些值必须是常量表达式。 非类型参数可以是一个整型,对应模板实参必须是常量表达式。...成员模板是函数模板模板外定义一个成员模板,必须同时为模板成员模板提供模板参数列表。...顶层 const,无论是形参还是实参中,都会被忽略。 const转换,可以一个非 const对象引用(或指针传递给一个 const引用(或指针)形参。...显式模板实参按由左至右顺序与对应模板参数匹配,推断不出模板参数类型定义应该放在参数列表最左边。...,当分别传递右值左值实参模板参数类型可能是普通类型,也可能是引用类型

1.4K20

第 16 章 模板与泛编程

因为编译器需要在编译实例化模板,此时非类型参数会被一个用户提供或编译器推断值所代替,所以这些值必须是常量表达式。 非类型参数可以是一个整型,对应模板实参必须是常量表达式。...成员模板是函数模板模板外定义一个成员模板,必须同时为模板成员模板提供模板参数列表。...顶层 const,无论是形参还是实参中,都会被忽略。 const转换,可以一个非 const对象引用(或指针传递给一个 const引用(或指针)形参。...显式模板实参按由左至右顺序与对应模板参数匹配,推断不出模板参数类型定义应该放在参数列表最左边。...,当分别传递右值左值实参模板参数类型可能是普通类型,也可能是引用类型

1.4K60

c++模板与泛编程

非类型参数可以是一个整型,或者是一个指向对象或函数类型指针或(左值)引用。 非类型模板参数模板实参必须是常量表达式。...绑定到指针或引用非类型参数实参必须具有静态生存期,即不能用一个非static局部变量或动态对象作为指针或引用非类型模板参数实参。...因此,与非模板代码定义函数声明放在头文件中而普通函数成员函数定义放在源文件中不同,模板头文件通常既包括声明也包括定义。...模板外使用时,返回值类型必须提供模板参数函数体内,由于已经进入作用域,所以无需重复模板实参,默认与成员实例化所用类型一致。...2 模板实参推断 2.1 类型转换与模板类型参数 实参传递给带模板类型函数形参,能够自动应用类型转换只有const转换及数组或函数到指针转换。

58420

C++ 学习笔记

类型是 nullptr),浮点数对象不能作为非类型模板参数。...2.当传递对象指针或者引用作为模板参数,对象不能是字符串常量,临时变量或者数据成员以及其它子对象。 3.对于非类型模板参数是 const char*情况,不同 c++版本有不同限制 a....2.也可以通过数组或字符串长度作为非类型模板参数,定义可以适配不同长度裸数组或字符串常量模板。...2.非类型模板参数可以是以下形式: a.整型或枚举类型 b.指针类型 c.指向成员指针 d.左值引用 e.std::nullptr_t f.含有 auto 或者 decltype(auto)类型(...(5)对于函数类型, 该集合包含所有参数类型返回类型关联关联名字空间 (6)对于 X 成员指针类型,除了包括成员相关关联名字空间,关联,该集合还包括与 X 相关关联名字空间关联 #

6.5K63

《C++Primer》第十六章 模板与泛编程

,或者是一个指向对象或者函数类型指针或(左值)引用 绑定到非类型参数实参必须是一个常量表达式 绑定到指针或者引用非类型参数实参必须具有静态生存期 1.2 编写类型无关代码 编写泛代码两个重要原则...Blob(It b, It e); // ... }; // 当我们模板外定义一个成员模板, 必须同时为模板成员模板提供模板参数列表, 模板参数列表在前, 后跟成员模板参数列表...一个数组形参可以转换为一个指向其首元素指针,一个函数实参可以转换为一个该函数类型实参 实参传递给待模板类型函数形参,能够自动应用类型转换只有const转换及数组或函数到指针转换。...否则 XT 4.函数指针实参推断 当我们用一个函数模板初始化一个函数指针或者为一个函数指针赋值,编译器使用指针类型推断模板实参。...但是C++正常绑定规则外定义了两个例外规则,允许这种绑定: 第一个例外规则:当我们一个左值(如i)传递给函数右值引用参数,且此右值引用指向模板类型参数(如T&&),编译器推断模板类型参数为实参左值引用类型

1.7K10

【笔记】《C++Primer》—— 第三部分:设计者工具

当我们需要显式调用递增递减运算符,我们需要对后置版本参数传递一个任意int值,这样编译器才能区分出版本 重载函数调用运算符让我们可以像使用函数一样使用对象,称为函数对象,函数对象常常用作泛算法实参...模板与泛编程 OOP让我们可以在运行时处理运行前未知动态情况,而泛型模板编程让我们可以在编译就处理好一些动态情况 当我们调用函数模板,编译器以前一样可以自动按照我们实参来推断模板参数类型...可以由具体关键字带头声明非类型参数非类型参数表示是一个值而不是类型,因此非类型参数在编译时会被用户提供或编译器推断一个常量代替,从而允许我们初始化数组之类 非类型参数可以是整型或指向对象或函数指针或左值引用...模板不会推断参数类型 模板成员函数只有使用时才会实例化 模板与另一个模板直接最常见友元是一对一友元,首先模板需要声明所有需要用到名字,然后声明友元标注出目标具体模板实参 模板也可以一对多友元...,我们可以用尾置返回来完成这个目标: 标准库头文件type_traits中来进行特殊类型转换能够动态地这些语言特性消去从传入参数中提取出我们想要类型 编译器是从模板函数调用中推断具体实参类型要求

1.7K10

CC++开发基础——函数模板

一,函数模板 1.基础概念 模板编程是C++中泛编程基础。 一个模板可以是创建或者函数蓝图。 模板编程分两种,分别是算法抽象模板数据抽象模板。...函数模板实例化以后,模板参数会变成具体数据类型,比如int, char等。 对于某一种具体数据类型,比如int,无论以这个数据类型调用多少次函数模板,最后只生成一次该类型模板实例。...result1 = add(2, 3); double result2 = add(2.2, 3.3); 实例化过程图示: 项目工程中,我们通常将定义放在头文件中,成员函数定义放在源文件中...: 整型,如int、long等 枚举类型 对象类型引用或指针 函数引用或指针 成员指针模板参数列表中,同时有类型模板参数非类型模板参数,建议非类型模板参数写在类型模板参数前面。...a : b; } 由于该函数模板不适用于指针数据类型,因此,定义以下函数模板特例。 函数模板特例,代码逻辑中相比原始函数模板多了解引用操作。

13121

C++模板(关键字template,typename)介绍

模板是C++支持参数化多态工具,使用模板可以使用户为或者函数声明一种一般模式,使得某些数据成员或者成员函数参数、返回值取得任意类型。...模板是一种对类型进行参数工具; 通常有两种形式:函数模板模板; 函数模板针对仅参数类型不同函数; 模板针对仅数据成员成员函数类型不同。...一但声明了模板函数就可以用模板函数形参名声明成员变量成员函数,即可以该函数中使用内置类型地方都可以使用模板形参名。...,模板形参不能为空,一但声明了模板就可以用模板形参名声明成员变量成员函数,即可以中使用内置类型地方都可以使用模板形参名来声明。...也就是说不能把整型值2推演为int 传递模板形参。要把模板形参调置为int 必须这样指定A m。

86520

C++模板总结

模板是 C++ 支持参数化多态工具,使用模板可以使用户为或者函数声明一种一般模式,使得某些数据成员或者成员函数参数、返回值取得任意类型。...模板是一种对类型进行参数工具;通常有两种形式:函数模板模板: 函数模板 针对仅参数类型不同函数; 模板 针对仅数据成员成员函数类型不同....,一但声明了模板就可以用模板形参名声明成员变量成员函数,即可以中使用内置类型地方都可以使用模板形参名来声明。...4、 模板外部定义成员 template 后形参表应省略默认形参类型。...: 我们使用模板,只有当代码中使用了模板一个实例名字,而且上下文环境要求必须存在定义,这个模板才被实例化: 1、声明一个模板指针引用,不会引起模板实例化,因为没有必要知道该类定义

1.2K20

【c++】模板编程解密:C++中特化、实例化分离编译

类型形参即:出现在模板参数列表中,跟在class或者typename之类参数类型名称 非类型形参,就是用一个常量作为(函数)模板一个参数(函数)模板中可将该参数当成常量来使用 非类型模板参数允许你一个值...非类型模板参数可以是一个整型值、一个指针或者一个引用,因为这些参数不是类型,所以被称为“非类型模板参数”。 非类型模板参数可以让你根据这些值创建模板实例。...,它表示数组大小,而 T 是一个类型模板参数代表数组中元素类型 使用方法: array a1; array a2; 注意: 浮点数、对象以及字符串是不允许作为非类型模板参数...使用非类型模板参数时候,你传递值必须在编译就确定下来。...上述示例中,p1指向d1显然小于p2指向d2对象,但是Less内部并没有比较p1p2指向对象内容,而比较是p1p2指针地址,这就无法达到预期而错误 此时,就需要对模板进行特化。

29310

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

引用 Microsoft Docs: 模板是 c + + 中编程基础。 作为类型语言,c + + 要求所有变量都具有特定类型,由程序员显式声明或由编译器推断。...但是,许多数据结构算法外观都是相同,无论它们操作类型是什么。 利用模板,您可以定义或函数操作,并允许用户指定这些操作应使用具体类型。...当你参数类型需要两种或以上时候,就是 template 当中增加声明,再对函数或进行修饰: template 那么,除了基本数据类型,...于是我们可以总结出语法: 1,使用 template 对声明定义进行修饰。 2,内部需要使用模板类型,直接使用相应模板形参名。...然后:模板当中非类型形参 这是一个什么东西呢? 1,它是一个常量。 2,它类型只能是 int 、指针、引用这三种内置类型。 3,调用它只能是一个常量表达式。 它使用场景?

65820

C++模板大总结!

模板是C++支持参数化多态工具,使用模板可以使用户为或者函数声明一种一般模式,使得某些数据成员或者成员函数参数、返回值取得任意类型。...模板是一种对类型进行参数工具;通常有两种形式:函数模板模板: 函数模板 针对仅参数类型不同函数; 模板 针对仅数据成员成员函数类型不同....2、 非类型形参模板定义内部是常量值,也就是说非类型形参模板内部是常量。 3、非类型模板形参只能是整型,指针引用,像double,String, String **这样类型是不允许。...4、 模板外部定义成员template 后形参表应省略默认形参类型。...: 我们使用模板,只有当代码中使用了模板一个实例名字,而且上下文环境要求必须存在定义,这个模板才被实例化: 1、声明一个模板指针引用,不会引起模板实例化,因为没有必要知道该类定义

53320

模板优化让程序更灵活更通用

这里写目录标题 模板 模板模板 非类型模板参数 模板 C++中模板(Class Template)允许创建一个通用,其中数据成员成员函数类型可以作为参数进行指定。...非类型模板参数 非类型模板参数(Non-type Template Parameters)是C++中一种特殊模板参数,它允许使用模板传递非类型作为参数。...通过非类型作为参数传递模板,我们可以根据实际需求来定制生成代码。 通常情况下,模板参数类型参数,例如template 中T就是一个类型参数。...但是非类型模板参数允许我们使用非类型作为参数,比如整数、枚举、指针等。 非类型模板参数可以在编译确定,因此它们值必须是常量表达式,并且可以模板参数列表中直接提供。...main函数中,我们实例化了一个Array模板对象arr,通过传递整数值5作为非类型模板参数,定义了一个大小为5数组。

10910

【C++】模板进阶

;而非类型形参则是用一个常量作为模板/函数模板一个参数模板/函数模板中可将该参数当成常量来使用。...C++ 中设计了非类型模板参数来解决了这个问题,如下,我们可以通过传递不同非类型形参来定义不同非类型模板参数函数模板使用也是如此: template...;上述示例中,p1 指向 d1 显然小于 p2 指向d2 对象,但是 Less 内部并没有比较 p1 p2 指向对象内容,而比较是 p1 p2 指针地址,这就无法达到预期而发生错误。...stack 进行声明定义分离,注意: 1、模板外部成员定义不得具有默认参数,即模板声明与定义分离不能成员函数不能使用缺省参数; 2、模板成员函数分离定义必须指明该函数是属于那个...(这种方式使用于较大,方便别人快速了解我们) 3、注:这两种方法都有一个缺点 – 会暴露源码,因为函数声明定义是一个文件中,我们提供给别人使用时不得不将源码也暴露给别人,这也是模板一个缺点

40700

【C++】模板进阶

1.非类型模板形参 初阶模板中,函数模板模板所传参数前面都是class或者typename修饰,是类型形参,但是模板除了可以传递类型形参之外还可以传递非类型形参 模板参数分类类型形参非类型形参...非类型形参:用一个常量作为(函数)模板一个参数(函数)模板中可将该参数当成常量来使用。...,N=10 size_t _size; }; } 注意: 浮点数、对象以及字符串是不允许作为非类型模板参数。...非类型模板参数必须在编译期就能确认结果。 非类型模板参数必须是整数类型、枚举类型指向对象指针或引用类型。...这是因为在编译非类型模板参数需要在编译器确定其值,而浮点数、对象以及字符串在编译无法确定其值。

5810

【泛编程】模板全详解

这里要拿 Stack 去指定域才对。 ② 模板函数外定义,没加 “模板参数列表” ,编译器不认识这个 T 。模板中函数放在外进行定义,需要加模板参数列表。...② 模板 运行时 不检查数据类型,也不保证数据安全,相当于类型宏替换。 ③ 模板 是一个家族,而 模板 是通过 模板实例化具体。...④ 模板 成员函数 全是模板函数,外定义都必须通过完整模板语法进行定义。 Ⅳ....非类型形参:就是用一个常量作为 (函数) 模板一个参数 (函数) 模板中可将该参数当成常量来使用。 既然有了这个非类型模板参数,我们尝试着来解决问题!...d1显然小于p2指向d2对象,但是Less内部并没有比较p1p2指向对象内容,而比较是p1p2指针地址,这就无法达到预期而错误。

64620

C++:18---函数模板(template)

只有当实例化处模板一个特定版本,编译器才会生成代码 重点:通常,当我们调用一个函数/定义实例化一个,编译器只需掌握函数声明/声明即可,因此可以把函数/声明放置头文件,而把函数/定义放置源文件中...但是模板则不同:为了实例化模板函数,编译器必须掌握函数模板/模板成员函数声明定义,因此只能将模板函数/声明定义都放置头一个头文件/源文件中(重点) 二、函数模板模板函数 函数模板:一个模板...一个非类型参数表示一个值而非一个类型。并且通过特定类型名定义而非typename或class来定义 当一个模板被实例化时,非类型参数被用户提供或者编译器推断值所代替。...重点:一个非类型参数可以是一个整型、一个指向对象或函数指针(或引用)。且实参必须是一个常量表达式 //定义模板以及一个函数模板。...,那么这个函数模板操作性与可移植性就比较差 为了解决上面这个问题,我们定义函数模板,就需要考虑类型无关与可移植性 案例: 下面这个函数模板如果调用它比较两个指针,而这两个指针指向相同数组,

1.1K50

C++ 模板学习

4.非类型模版参数 一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象指针。 那么就是说,浮点数是不行指向内部链接对象指针是不行。...类型推导隐式类型转换 决定模板参数类型前,编译器执行下列隐式类型转换:   左值变换   修饰字转换   派生到基转换   见《C++ Primer》([注2],P500)对此主题完备讨论...它去除const修饰,绝不会用const类型实例化函数模板,总是用相应非 const类型,不过对于指针来说,指针 const 指针是不同类型。...底线是:自动模板参数推导包含类型转换,并且在编译器自动决定模板参数某些类型属性丢失。这些类型属性可以使用显式函数模板参数申明时得以保留。 6....当然,答案3 成员函数指针指向成员函数就是意料之中答案了。 8. 仿函数用处 不管是对象还是函数指针等等,它们都是可以被作为参数传递,或者被作为变量保存

917100
领券