变长参数模板
来源:互联网 发布:焊接机器人编程 编辑:程序博客网 时间:2024/06/05 08:49
#include "stdafx.h"#include "stdarg.h" #include <iostream>#include <functional>#include <vector>using namespace std;/************************************************************************//* Title: 变长参数模板 示例 *//* Environment:VS2013Update4 *//* Author: kagula *//* Keyword: Variadic templates, Parameter pack, extension pack *//* Date: 2015-07-20 *//* Remark:参考资料不够准确,在它基础上对样本做了修改 *//* Reference: 《C 可变长参数 VS C++11 可变长模板》 *//* http://blog.csdn.net/zj510/article/details/36633603 *//************************************************************************/double Sum(int count, ...){va_list ap;//need include stdarg.h filedouble sum = 0;va_start(ap, count);for (int i = 0; i < count; ++i){double arg = va_arg(ap, double);sum += arg;}va_end(ap);return sum;}//////////////////////////////////////////////////////////////////////////// parameter pack 使用方式一// Variadic template 代表了 零个或多个template// Variadic template 的定义 typename...// Variadic template 的“变量” Tail...// 下面是第一个例子//////////////////////////////////////////////////////////////////////////template<typename... A> class BMW{}; // 边界template<typename First, typename... Args>class BMW<First, Args...> : public BMW < Args... >{public:BMW(){printf("type: %s\n", typeid(First).name());}private:First head;};BMW<int, char, float> car;//////////////////////////////////////////////////////////////////////////// parameter pack 使用方式二//////////////////////////////////////////////////////////////////////////template<typename... T> double Sum2(T... first) // 边界{return 0;}template<typename T, typename... Args> double Sum2(T first, Args... arg){double ret = first + Sum2(arg...);return ret;}//////////////////////////////////////////////////////////////////////////// parameter pack 使用方式二的变形//////////////////////////////////////////////////////////////////////////template<typename T> T Sum3(T v) {return v;}template<typename T, typename... Args> T Sum3(T first, Args... args) {return first + Sum3(args...);}//////////////////////////////////////////////////////////////////////////// parameter pack 在 lambda 中的应用// lambda 同 std::function是两种不同的类型。// 所以下面是 lambda 转 std::function 的示例。//////////////////////////////////////////////////////////////////////////template <typename T>struct function_traits: public function_traits < decltype(&T::operator()) >{};template <typename ClassType, typename ReturnType, typename... Args>struct function_traits < ReturnType(ClassType::*)(Args...) const > {typedef function<ReturnType(Args...)> f_type;};template <typename L>typename function_traits<L>::f_type make_function(L l){return (typename function_traits<L>::f_type)(l);}template <typename A, typename B>vector<B> map(std::function<B(A)> f, vector<A> arr) {vector<B> res;for (size_t i = 0; i < arr.size(); i++) res.push_back(f(arr[i]));return res;}int _tmain(int argc, _TCHAR* argv[]){//double sum = Sum(4, 1.0, 2.0, 3.0, 4.0);cout << "C Syntax: " << sum << endl;//double ret2 = Sum2(1.0, 2.0, 3.0, 4.0);cout << "C++11 Syntax: " << ret2 << endl;//double ret3 = Sum3(1.0, 2.0, 3.0, 4.0);cout << "C++11 Syntax2: " << ret3 << endl;//下面这段代码,只是演示 variadic template with lambda//实践上,更适合用C++ GPU技术来处理vector<int> a = { 1, 2, 3 };vector<int> result = map(make_function([](int x) -> int { return x*x; }), a);for each (auto var in result){cout << var << endl;}//cin.get();return 0;}
0 0
- C++变长参数模板
- 变长参数模板
- 【c++11】变长参数模板
- C++学习 - 模板函数变长参数
- 变长参数
- 变长参数
- 变长参数
- 变长参数
- 变长参数
- 变长参数
- C++11 理解 (十七) 之 变长参数模板
- C++11 新特性之 变长参数模板
- C++11标准——变长参数模板
- c++ 变长模板
- 使用C++11变长参数模板 处理任意长度、类型之参数实例
- 使用C++11变长参数模板 处理任意长度、类型之参数
- 变长参数的 Tracer
- 变长参数应用举例
- C++ 虚析构函数、纯虚析构函数
- Android存储之SharedPreferences
- 7月20日Java基础:本人为新手正在学习Java中把每天学的东西晚上都会在博客记录希望大神可以指点 不足在此谢过。
- C++基础---内联函数
- java基础之类型转换
- 变长参数模板
- Oracle编程,遇到并发的情况处理
- POJ 3835 Columbus's bargain(最短路)
- Android中利用java反射机制Reflect
- Machine Learning week 4 One vs All and Neural network
- C#静态构造函数
- Java中单例设计模式
- 1066 Bash游戏
- ping工具的C语言简单实现 (ICMP echo)