C++11的模板新特性-变长参数的模板

这个特性很赞,直接给例子吧,假如我要设计一个类,CachedFetcher内部可能使用std::map也可能使用std::unordered_map,也可能是其它的map,怎么设计呢?没有C++11变长模板之前这很费劲。。 因为map的模板参数可不是只有key,value两个啊,还有一些有默认参数的template参数。。。

?
?

template<typename _Key, typename _Value,

template<class _Kty, class _Ty, typename...> class _Map = std::unordered_map>

class CachedFetcher

{

public:

typedef _Key Key;

typedef _Value Value;

typedef _Map<Key, Value> Map;

typedef typename Map::iterator iterator;

typedef typename Map::const_iterator const_iterator;

?
?

private:

Map _map;

};

?
?

?
?

?
?

另外一个比较好的特性

template<typename _Key, typename _Value,

template<class _Kty, class _Ty, typename...> class _Map = std::map>

class LruMap

{

};

template <typename Key, typename Value, typename...>

using LruHashMap = LruMap<Key, Value, std::unordered_map>;

?
?

?
?

最后非模板的一个有用特性,复用基类的构造函数

?
?

class FeatureVector : public Vector

{

public:

~FeatureVector() = default;

FeatureVector(FeatureVector&&) = default;

FeatureVector& operator = (FeatureVector&&) = default;

FeatureVector(const FeatureVector&) = default;

FeatureVector& operator = (const FeatureVector&) = default;

?
?

#ifndef GCCXML

using Vector::Vector;

#endif

}

?
?

时间: 2024-10-06 23:09:33

C++11的模板新特性-变长参数的模板的相关文章

C++11 新特性之 变长参数模板

template <typename ... ARGS> void fun(ARGS ... args) 首先明确几个概念 1,模板参数包(template parameter pack):它指模板参数位置上的变长参数,例如上面例子中的ARGS 2,函数参数包(function parameter pack):它指函数参数位置上的变长参数,例如上面例子中的args 一般情况下 参数包必须在最后面,例如: template <typename T, typename ... Args>

介绍C++11标准的变长参数模板

目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属变长参数模板(variadic template)了.下面先介绍一下这个语法特性在C++11标准中的描述. 14.5.3 变长参数模板(Variadic templates) 1.一个模板形参包(template parameter pack)是一个接受零个或多个模板实参的模板形参.[例: template<class ... Types> st

C++11新特性之五——可变参数模板

有些时候,我们定义一个函数,可能这个函数需要支持可变长参数,也就是说调用者可以传入任意个数的参数.比如C函数printf(). 我们可以这么调用. printf("name: %s, number: %d", "Obama", 1); 那么这个函数是怎么实现的呢?其实C语言支持可变长参数的. 我们举个例子, double Sum(int count, ...) { va_list ap; double sum = 0; va_start(ap, count); fo

Xcode 11.4 发布新特性

Xcode 11.4 发布新特性 Xcode 11.4 包含适用于 iOS 13.4,iPadOS 13.4,tvOS 13.4,watchOS 6.2 和 macOS Catalina 10.15.4 的SDK.Xcode 11.4 版本支持在 iOS 8+,tvOS 9+ 以及 watchOS 2+ 的设备上调试,同时需要运行 macOS Catalina 10.15.2+ 版本的 Mac. 通用 • Xcode 11.4 可以构建和分发支持 通用购买 的 macOS 应用.要将 macOS

RAC 11.2的新特性

网格即插即用(GPnP) 网格即插即用帮助管理员来维护集群,以前增加或删除节点需要的一些手动操作的步骤现在可以由GPnP来自动实现. GPnP不是一个单独的概念,它依赖于以下特性:在一个XML配置文件中储存集群信息:集群时间同步(CTSS):网格命名服务(GNS):单一客户端访问名称(SCAN):服务器池(Server Pools). GPnP为公网和私网连接.ASM spfile.CSS投票盘定义了元数据网络接口,profile.XML文件通过wallet保护以避免被修改.如果你需要手动修改p

C++11 变长参数的宏定义以及__VA_ARGS__

[1]变长参数的宏定义以及__VA_ARGS__ 在C99标准中,我们就已经可以使用变长参数的宏定义. 变长参数的宏定义是个神马?就是在宏定义的参数列表中最后一个参数为省略号. 而现在C++ 11中,使用预定义宏__VA_ARGS__可以在宏定义的实现部分替换省略号所代表的字符串. 原书示例: #include <stdio.h> #define LOG(...) { \ fprintf(stderr, "%s: Line %d:\t", __FILE__, __LINE_

ArcGIS API For Javascript新版本3.11中的新特性

ArcGIS API For Javascript新版本3.11中的新特性: 更简短的引用URL:如果你正在将用以前的版本的程序更新到新版本的话,这是很重要的. To update your code for version 3.11 references, replace the following URLs accordingly: /3.10/js/dojo/ should now read /3.11/ (note the dropped "/js/dojo") 将你的源码更新

(一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作符 4) 不定参数宏定义以及__VA_ARGS__ 5) 宽窄字符串连接 这些特性并不像语法规则一样常用,并且有的C++编译器实现也都先于标准地将这些特性实现,因此可能大多数程序员没有发现这些不兼容.但将这些C99的特性在C++11中标准化无疑可以更广泛地保证两者的兼容性.我们来分别看一下. 这次,

【Unix环境高级编程】编写变长参数函数

文件的格式输入输出函数都支持变长参数.定义时,变长参数列表通过省略号'...'表示, 因此函数定义格式为: type 函数名(parm1, parm2,parmN,...); Unix的变长参数通过va_list对象实现,定义在文件'stdarg.h'中,变长参数的应用模板如下所示: #include <stdarg.h> function(parmN,...){ va_list pvar; ................................. va_start(pvar,par