`
369540808
  • 浏览: 196479 次
文章分类
社区版块
存档分类
最新评论

C++ - 可变参数函数模板(Variadic Function Template) 详解 及 代码

 
阅读更多

可变参数函数模板(Variadic Function Template) 详解 及 代码


本文地址:http://blog.csdn.net/caroline_wendy/article/details/17076695


可变参数函数模板(variadic function template), 主要使用了包扩展(pack expansion)的方式, 即"...",

把一个模式(pattern)扩展为包中每一个元素(element)的形式;

可变参数函数模板, 经常会使用递归(recursive)进行处理包(pack)参数,

需要一个非可变参数(nonvariadic)函数模板,结束递归, 当最后一次调用时, 会调用非可变参数版本, 则递归结束;

还需要一个绑定(bing)的参数, 处理包(pack)中的一些元素, 通过递归,顺次处理包中的元素;

包扩展可以应用于各种形式, 如

函数的模板参数, 例如: templae<typename Args...>

函数的参数模板, 例如: cosnt Args&... rest

函数的形参, 例如: rest...

函数模板, 例如: debug_rep(rest)...

具体参见注释及结果, 代码如下:

//=====================================
// Name        : CppPrimer.cpp
// Author      : Caroline
// Version     : 1.0
// Description : Example, UTF-8
//=====================================

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <sstream>

using namespace std;

//返回bug信息
template <typename T> std::string debug_rep (const T& t)
{
	std::ostringstream ret;
	ret << t;
	return ret.str();
}

//非可变参数模板
template<typename T>
std::ostream &print(std::ostream &os, const T &t)
{
	//std::cout << "This is nonvariadic function! ";
	return os << t;
}

//可变参数模板, "..."是包扩展(Pack Expansion)
template <typename T, typename... Args>
std::ostream &print(std::ostream &os, const T &t, const Args&... rest)
{
	os << t << ", ";
	return print(os, rest...);
}

//函数模板的包扩展
template <typename... Args>
std::ostream &errorMsg(std::ostream &os, const Args&... rest)
{
	return print(os, debug_rep(rest)...); //使用模板的包扩展
}

int main()
{
	int i(10); std::string s("girls");
	//print(std::cout, i, s, 42);
	errorMsg(std::cout, i, s, 10, "ladies");

	return 0;
}

输出:

10, girls, 10, ladies


分享到:
评论

相关推荐

    详解C++11 变参模板

    变参模板(variadic template)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一...

    C++ Templates The Complete Guide, 2nd Edition

    《C++ Template》第二版,2017年9月16日出版 Templates are among the most powerful features of C++, but they remain misunderstood and underutilized, even as the C++ language and development community ...

    variyak:宏以使用容器中的数据来调用可变参数函数

    瓦里亚克 此板条箱提供了一个宏call_variadic ,可用于构造样板代码,以使用容器(例如Vec)中的数据来调用可变参数函数。 例子: #![feature(c_variadic)]use variyak :: call_variadic;fn main () { let data = ...

    The C++ Standard Library 2nd Edition(高清)pdf

    The book focuses on the Standard Template Library (STL), examining containers, iterators, function objects, and STL algorithms. You will also find detailed coverage of strings, concurrency, random ...

    C++ Templates The Complete Guide, 2nd Edition epub

    《C++ Template》第二版,2017年9月16日出版 Templates are among the most powerful features of C++, but they remain misunderstood and underutilized, even as the C++ language and development community ...

    C++ Templates The Complete Guide 2nd Edition

    The authors provide authoritative explanations of all new language features that either improve templates or interact with them, including variadic templates, generic lambdas, class template argument...

    iphone开发实例 04-Variadic Arguments

    04-Variadic Arguments.rar

    VariadicExtension::beer_mug:扩展为Behat步骤定义添加了可变参数支持

    可变参数扩展 为Behat步骤定义增加了可变参数支持。 用法 安装它: $ composer require friends-of-behat/variadic-extension --dev 在您的Behat配置中启用它: # behat.yml default : # ... extensions : ...

    The.C++.Standard.Library.A.Tutorial.and.Reference.2nd.Edition

    The book focuses in particular on the Standard Template Library (STL), examining containers, iterators, function objects, and STL algorithms. The book covers all the new C++11 library components, ...

    C++中关于委派(Delegates)的实现示例

    在这篇文章中,我想提出一个简单的 C++ 委派的实现,是用 C++ 成员函数指针和 C++11 的可变模板(variadic templates),目前这套实现方法仅支持 GNU C++ 4.7.0,在 Windows 下可使用 MinGW。 背景 在我的方法中奖提供...

    C++实现的一个可以写递归lambda的Y函数

    最近学习C++11的variadic template argument,终于可以摆脱用fpmacro模板来复制一大堆代码的做法了,好开心。这个例子的main函数用lambda写了一个斐波那契数列的递归计算函数。跟以往不同的是,在Y函数的帮助下,这...

    Lua-C 绑定库LuatinkerE.zip

    支持普通函数、类成员函数、构造函数支持函数默认参数及带默认参数的重载函数的匹配移除int64相关函数,使用lua5.3的luaInterager来替代支持调用lua函数时返回多个返回值用tuple包裹支持通过宏定义打开类型一致性...

    node-argx:Node.js模块来解析函数参数

    argx 解析函数参数。 对实现可变参数功能很有用。安装npm install argx --save用法将arguments对象传递到arguments内的.argx() 。 /** * This is an example to declare an variadic functions. */'use strict'const...

    dsc.rar_it

    这个系列其实早就想写了,断断续续关注C++0x也大约有两年余了,其间看着各个重要proposals一路review过来:rvalue-references、concepts、memory-model、variadic-templates、template-aliases、auto/decltype、GC、...

    cool-relational-interpreter-examples:工作中的关系 Scheme 解释器的有趣、有趣和发人深省的例子

    很酷的关系解释器示例 工作中的关系 Scheme 解释器的有趣、有趣和发人深省的例子。 我正在与 Michael Ballantyne 合作寻找/创建... append/variadic-lambda-tests.scm专注于在支持可变参数函数、 apply 、 letrec 、

    va_args_count:使用AC宏在C99 __VA_ARGS__宏中查找参数的数量

    您可能有一个函数,需要使用可变数量的参数,如下所示: void print_strings(int count, const char *s1, ...); 其中第一个参数count指定传递给该函数的字符串参数的数量。 错误使用这种类型的函数很容易: // ...

    boston-clojure-group-talk:2015 年 2 月 12 日我在波士顿 Clojure Group 的(虚拟)演讲中的代码

    boston-clojure-group-talk 2015 年 2 月 12 日我在波士顿 Clojure Group 的(虚拟)演讲中的代码boston-transcript.scm包含演讲中的代码和评论。 请从这里开始! mk.scm包含mk.scm的实现。 interp-with-variadic-...

    holbertonschool-low_level_programming

    专案0 * 1 * 2 * 3 * 4 *更多功能5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 *更多 13 * 预处理器14 * Structures_typedef 15 * Function_pointers 16 * Variadic_functions 17 *单链接列表18 * More_singly_linked_lists 。...

    comder:Commander.js研讨会

    ARGUMENTS (名称不够精简)最后一个参数可以是可变参数COMDER_COMMANDS Git风格的子命令COMMAND_ACTION 注册命令的回调函数 安装 运行npm install comder -g 奔跑comder comder将参加一系列Node.js研讨会。...

Global site tag (gtag.js) - Google Analytics