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

如何在C++17之前模拟类模板参数推导?

在C++17之前,可以使用模板元编程技术来模拟类模板参数推导。具体的实现方法如下:

  1. 使用模板特化:定义一个模板类,其中的模板参数用于推导,然后通过特化来实现参数推导。例如:
代码语言:txt
复制
template <typename T>
struct MyClass;

template <>
struct MyClass<int> {
    // 特化的实现
};

template <>
struct MyClass<double> {
    // 特化的实现
};
  1. 使用函数模板:定义一个函数模板,通过函数模板的参数推导来模拟类模板参数推导。例如:
代码语言:txt
复制
template <typename T>
struct MyClass {
    // 类模板的实现
};

template <typename T>
void foo(MyClass<T> obj) {
    // 使用函数模板参数推导来创建对象
}

int main() {
    foo(MyClass<int>());    // 推导出 MyClass<int>
    foo(MyClass<double>()); // 推导出 MyClass<double>
    return 0;
}

这样就可以在C++17之前模拟类模板参数推导了。需要注意的是,这种模拟方法可能会增加代码的复杂性和可读性,因此在C++17之后,推荐直接使用类模板参数推导的特性来实现。

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

相关·内容

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

看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第三篇~ 在之前的文章中我介绍了一些C++17语言核心层的变化,这次我会介绍更多的相关细节,涉及的主题有..., 在C++17中, auto 的这种自动类型推导能力又进一步增强了,借助auto,函数模板和(模板的)构造函数的模板参数可以根据其参数自动进行类型推导(细节介绍),非类型模板参数的类型也可以从参数中自动推导出来....下面我就来介绍一下非类型模板参数的自动类型推导....即便在可变参数模板中,非类型模板参数也可以进行自动类型推导. template class VariadicTemplate { ... }; template <auto...,而 TypeVariadicTemplate 模板(第7行至第11行)则仅会自动推导第一个非类型模板参数的类型,其余非类型模板参数的类型都与第一个非类型模板参数的类型相同.

70410

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

4.auto的好处 在C++中因为,命名空间等语法会出现std::map::iterator这样的特别长的类别,若单纯用typedef来简略代码则会出现新的麻...return 0; } 所以auto无疑是十分不错的选择 5、auto在C++14和C++17的更新 C++的auto关键字最初在C++11中引入,主要用于自动类型推导,使编程更简洁。...示例: auto genericAdd = [](auto x, auto y) { return x + y; }; C++17中对auto的更新 成员初始化: C++17允许在中使用auto...示例: struct Example { auto value = 42; // 自动推导为int }; 模板参数推导: C++17引入了模板参数推导,这意味着在使用模板时不再总是需要显式指定模板参数...对于函数模板,如果使用auto来指定参数类型,编译器可以根据传递的实参推导模板参数类型。

14810

C++17常用新特性

2 C++17新特性 2.1 折叠表达式 从C++17开始,可以使用二元操作符对形参包中的参数进行计算,这一特性主要针对可变参数模板进行提升,可以分为左折叠和右折叠。支持的二元操作符多达32个。...sum2 = sum_left(); std::cout<<"sum2="<<sum2<<std::endl; return 0; } 运行结果: sum1=6 sum2=16 2.2 <em>类</em><em>模板</em>实参<em>推导</em>...对<em>模板</em>进行实例化时,不需要指定<em>模板</em><em>参数</em>,编译器会根据传入的实参进行类型<em>推导</em>。...在<em>模板</em><em>参数</em>中使用auto作为关键字时,<em>模板</em>实例化传入非类型值,auto可以<em>推导</em>出<em>参数</em>类型。...+17目前还不支持<em>参数</em>类型是浮点型的<em>推导</em>。

2.1K20

【ModernCpp】新特性之CTAD

second} {} T result()const{return first + second;} private: T first_; T second_; }; 这个例子很简单,声明一个模板...在c++17之前,如果我们要使用Add,往往必须像如下这么做: int main(){ Add ti(1,2); return 0; } 即在实例化对象ot的时候必须指明类型int。...自C++17起引入了新的特性Class Template Argument Deduction,简称为CTAD,即模板参数推导,那么就可以像如下这样实例化ADD: int main(){ Add...此时,我们可以使用C++17之前的实例方法即显示指明类型,如下: int main() { Add ts("hello, ", "world!...: Add(const char*, const char*) -> Add; 需要注意的是,这一行类型推导需要加在声明之后,这样编译器在遇到参数为const cha*的时候

24120

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

如下面的例子: auto sum = [](auto p1, auto p2) { return p1 + p2; }; 这样定义的lambda式有点像是模板,调用sum时会根据传入的参数推导出类型,你可以传入...非类型模板形参的占位符(C++17C++17标准再次拓展了auto的功能,使得能够作为非类型模板形参的占位符,如下的例子: template void func() { std...double类型,但模板参数不能接受是double类型时,则会导致编译不通过。...结构化绑定功能(C++17C++17标准中auto还支持了结构化绑定的功能,这个功能有点类似tuple类型的tie函数,它可以分解结构化类型的数据,把多个变量绑定到结构化对象内部的对象上,在没有支持这个功能之前...虽然不能支持声明非静态数据成员,但却可以支持声明静态数据成员,在C++17标准之前,使用auto声明静态数据成员需要加上const修饰词,这就给使用上造成了不便,因此在C++17标准中取消了这个限制:

13420

C++发展概述

1979年,Bjame Stroustrup到了Bell实验室,开始从事将C改良为带的C(C with Classes)的工作,1983年该语言被正式命名为C++,主要意图是表明C++是C的增强版,1985...从2003年到2011年,也就是从C++03到C++11,期间C++引入了对象移动、右值引用、lamba表达式(函数式编程)、编译时类型识别(auto)、别名模板以及很多新型关键词(nullptr、decltype...近年来,C++标准的变更周期缩短,由C++11到C++14以及最近的C++17都只用了3年的时间。C++14引入了二进制文字常量、将类型推导从Lambda函数扩展到所有函数、变量模板以及数字分位符等。...到了2017年,C++迎来了C++17标准。此次对C++的改进和扩增,让C++变得更加容易接受和便于使用了。...C++17引入了许多新的特性,比如模板参数推导、UTF-8文字常量、fold表达式、新类型以及新的库函数等。 C++仍在不断的发展,下一个版本将是C++20,C++历史上的标准变更如下。

69410

Modern c++快速浅析

在C++11中,Lambda表达式的参数需要具体的类型声明 auto MyLambda = [](int a, int b) { return a + b; }; auto用于Lambda表达式时,同样代表遵循模板类型推导的原则...,例如C++11中可以将其用于匿名函数参数推导 // 使用auto接住匿名函数,匿名函数使用auto进行参数推导,匿名函数的返回值使用auto推导 auto MyLambda = [](auto a..., auto b) { return a + b; }; 由于它也是遵循模板类型推导的原则,因此对于大括号初始物而言,参数还是返回值都无法正确的将其推导出来 Range-base-loop with auto...对于非模板类型参数而言,使用auto进行自动推断会方便很多 template auto是可选项而不是必选项 •对于部分情景而言,使用auto能够避免不少低级错误,Effective...decltype(auto) 上文中提到auto作为返回值时将采用模板类型推导的规则,正因为如此它可能会遗失一些我们需要的类型(引用或常量性),这个时候就需要使用decltype(auto) template

15410

c++17好用的新特性总结

这是因为 当用于auto声明变量的表达式是{}括起来的,推导的型别就会变成 std::initializer_list。 在C++17中,对auto表达式推导的规则进行了改变。...比如我想实现一个函数将不同类型的输入转化为字符串,在c++17之前需要写三个函数去实现,而c++17只需要一个函数。...c++17加入了try_emplace,避免了这个问题。同时try_emplace在参数列表中将key和value分开,因此进行原地构造的语法比emplace更加简洁。...与union相比有两点优势: 可以存储复杂类型,而union只能直接存储基础的POD类型,对于std::vector和std::string就等复杂类型则需要用户手动管理内存。...并行算法库 这可以说是C++17最重要的几个特性之一,这个特性为几乎所有标准库函数加上一个执行策略参数,可以让使用者选择并行还是串行,这不仅包括七个新的算法,还有我们熟知的sort等。

2.9K10

C++17常用新特性(十)---模板特性:字符串变量当做模板参数

在C++的历次版本发布中,对C++模板参数的标准一直保持开放的态度,且对参数的要求也在逐渐放宽。从C++17开始,非类型的模板参数也可以在使用时定义了而不必定义在不同的作用域。...1 在模板中使用字符串 在模板编程中,非类型的模板参数被限制了诸多条件,只能从以下几种类型中获取,:枚举、对象、指针、常量以及函数的左值引用、字符串变量。...对于字符串变量,使用方式和之前的版本并没有太大的区别,都不能直接在模板类型参数中使用。...,如果编译时没有注释: ExecptionMsg msgError; 编译将会报错,报错信息如下: 由此可见,在非类型的模板参数中,字符变量是不能直接使用的,在使用之前需要先进行定义...C++17除了继续遵守这个规范外,相对于之前的版本它允许在实例化模板的作用域内声明,然后使用。不得不说也算是一种进步了吧。

1.4K30

第七章 函数

型函数 int Add(int x, int y) { return x + y; } 函数详解 参数 函数可以在函数头的小括号中包含零到多个形参 包含零个形参时,可以使用void标记 对于非模板函数来说...+17标准强制忽略,C++17标准之前由编译器决定 } -fno-elide-constructors忽略C++11(C++17标准之前)中对复制临时对象强制忽略的约束 函数传值、传址、传引用 #include...int main() { fun({1, 2, 3, 4, 5}); // right fun({1, 2, 3, "123", 5}); // wrong } 可变长度模板参数...) C++14引入的方式:返回类型的自动推导 使用constexpr if构造“具有不同返回类型”的函数,接收常量表达式 返回类型与结构化绑定(C...++17)语法糖 [[nodiscard]]属性(C++17) 表明返回值很重要需要保留 函数重载与重载解析 函数重载:使用相同的函数名定义多个函数,每个函数具有不同的参数列表(参数个数或者参数类型不同

16630

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

如果你想知道这次会议的主要内容,请阅读下面的内容(我已经知道了绝大多数关于C++17库的内容,但是要将其全部写出来还是需要一定的时间) ?...C++17核心库文件 P0001R1 弃用register关键字 P0002R1 bool类型不再支持++运算符 P0012R1 异常成为类型系统的一部分,第五版 P0061R1 支持__has_include...第二版文件 N4531 替换std::rand,版本三 P0013R1 逻辑运算符类型特征 (revision 1)[C++17投票通过] 这些文件将会应用于N4529草案,然后进行拟议草案技术规范的投票...核心主题 1274.常见的非终结符表达式和内嵌初始化列表 1391.非推导模板参数参数类型的转化 1722.lambda函数指针转换函数应该不例外吗?...&&的不兼容 2052.模板参数推导vs重载操作符 2075.传递短初始化列表给数组引用参数 2101.对类型和值的依赖的错误说明 2120.数组作为标准布局的第一个非静态成员变量 库主题 1169.

1.1K60

C++那些事之万物皆可auto

C++那些事之万物皆可auto C++17引入了许多旨在提高代码表达性并减少模板代码冗余的功能。其中一个显著的增强是使用auto关键字声明非类型模板参数的能力。...在C++17中使用auto的非类型模板参数 在数据库场景中进行排序 考虑一个与数据库相关的Foo,你希望根据枚举表示的特定顺序进行排序: enum class SortOrder { Ascending...return K; } 然而,这可能会导致错误,因为编译器无法推断模板参数'U'。...现在的简化方式 在C++17之后,对于非类型模板参数,我们可以使用auto关键字来取代: template class T, auto K> auto GetSortOrder...结论 C++17引入的auto关键字用于非类型模板参数的声明极大地简化了模板代码。通过消除繁琐的类型声明,我们能够更加直观地表达代码意图,提高代码的可读性和可维护性。

11910

从零开始一起学习SLAM | C++新特性要不要学?

本文所谓的C++新特性是指C++11及其以后的C++14、C++17增加的新关键字和新语法特性。...其中C++11是C++98以来最重要的一次变化,而其后的C++14、C++17是在该基础上的完善和补充。 那么,问题来了,如果我不想学习新特性,还是像以前那样编程可以吗?...C++11之前如果我们要定义并初始化一个新变量,必须得知道其类型并定义,这在很多时候是非常繁琐的,比如迭代器的使用,而C++11之后引入了自动类型推导,一个auto解决一切,不需要关心类型,编译器会帮你自动推导出类型...4、简洁的lambda表达式 lambda表达式可以使得编程非常简洁,尤其适用于简单的函数,一般形式如下: [函数对象参数](操作符重载函数参数)->返回值类型{函数体} 下面是几个例子及解释: ?...5、随心所欲可变长的参数模板 在Python和MATLAB中可以非常方便的使用可以变长的参数,C++11以后引入了tuple,可以实现类似功能,并且可以传入多个不同类型的数据,如下图所示 ?

74520

【笔记】《深入理解C++11》(下)

模板类型后面的三个点...称为模板参数包, 模板参数包也可以是特化的 推导后的模板参数包再通过参数名称后的三个点...来进行解包(包扩展) 变长模板自然也可以用在函数模板中, 称为函数参数包....注意函数参数包必须是函数的最后一个参数包(模板参数包没有这个要求) 模板参数包可以在以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求: 表达式 初始化列表 基描述列表 成员初始化列表...B> class Foo{} // 两个模板参数包(容易编译错误, 必须保证编译器能够推导) template< template class......, 模板将其作为一种普通类型而非T*来推导 nullptr占用的内存与void*相同 C++11规定不能取nullptr的地址, 但还是可以用右值引用捕获nullptr然后取地址, 虽然这个地址没有意义...+17) 用于switch中, 表明此case没有break是预期内的行为, 只是一种提示 [[nodiscard]] (C++17) 目标的返回值不应放弃 [[maybe_unused]] (C++17

1K30

C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象

,如果在中禁止编译器默认生成拷贝构造和移动构造函数,代码将不会被编译通过。...在泛型函数中使用了完美转发,具体可以参考下文: 【C++11】 改成程序性能的方法--完美转发 除此之外,在C++17之后中禁止移动构造函数的默认生成在实际使用时可以正常编译和运行,但是在C++17之前是编译不过的...C++值类型体系可以分为三个阶段,分别是:C++11之前的值类型体系,C++11后到C++17期间的值类型体系以及C++17后的值类型体系。...具体如下: 3.1 C++11之前的值类型体系 C++11之前。值类型体系主要是从C语言继承而来。划分也比较简单,主要根据赋值语句进行划分,分为左值和右值。...auto类型时,decltype(auto) decltype(auto) bar() { return MyClass{}; }

1.2K20

C++ 学习笔记

1.直到 c++17,使用模板都需要显式指定模板参数。...3.1 模板的非类型模板参数 1.模板参数不一定是类型,可以是数值,可以给 Stack 指定最大容量,避免使用过程元素增删时的内存调整。...3.4 用 auto 作为非模板类型参数 1.从 C++17 开始,可以不指定非类型模板参数的具体类型(代之以 auto),从而使其可以用于任意有效的非类型模板参数的类型。...模板会只实例化用到的部分成员函数,函数模板如果提供了默认参数,也只会在这个参数会用到的时候实例化它。...,编译器会根据实参的类型和模板参数 T 定义的形式,推导出函数的各个参数的类型,如果最后推导的结论矛盾,则推导失败。

6.5K63
领券