C++ 11 可变参数模板和 boost::any 实现可变参数函数

 1 class SqlHelper
 2 {
 3 public:
 4     template <typename... Params>
 5     static bool preparedExecute(sql::PreparedStatement* pstmt, Params... parameters)
 6     {
 7         return doPreparedExecute(pstmt, 1, parameters...);
 8     }
 9
10 private:
11     template <typename... Params>
12     static bool doPreparedExecute(sql::PreparedStatement* pstmt, int i, boost::any value, Params... parameters)
13     {
14         setAnyType(pstmt, i, value);
15         return doPreparedExecute(pstmt, ++i, parameters...);
16     }
17
18     static bool doPreparedExecute(sql::PreparedStatement* pstmt, int i, boost::any value)
19     {
20         assert(pstmt != nullptr);
21         setAnyType(pstmt, i, value);
22         return pstmt->execute();
23     }
24
25     static void setAnyType(sql::PreparedStatement* pstmt, int i, boost::any value)
26     {
27         assert(pstmt != nullptr);
28
29         if (value.type() == typeid(int32_t))
30         {
31             pstmt->setInt(i, boost::any_cast<int32_t>(value));
32         }
33         else if (value.type() == typeid(std::string))
34         {
35             pstmt->setString(i, boost::any_cast<std::string>(value));
36         }
37         else if (value.type() == typeid(char const *))
38         {
39             pstmt->setString(i, boost::any_cast<char const *>(value));
40         }
41
42         // ......
43     }
44 };

其实就是在模板实例化的时候递归实例化

调用方法

1 SqlHelper::preparedExecute(pstmt.get(), "1", 1u, 1f, 1.0, std::string("1"));
2 SqlHelper::preparedExecute(pstmt.get(), 1.0, "1", 1f, 1u, std::string("1"), std::string("2"));

C++ 11 可变参数模板和 boost::any 实现可变参数函数

时间: 2024-10-27 03:02:45

C++ 11 可变参数模板和 boost::any 实现可变参数函数的相关文章

c++11 可变参数模板函数

c++11 可变参数模板函数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vector> #include <map> // 在C++11之前,类模板和函数模板只能含有固定数量的模板参数.C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板. // 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变

c++11可变参数模板的使用1

1.概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进.然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一. 虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一

第21课 可变参数模板(2)_展开参数包

1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明.一个参数包的展开函数和一个递归终止函数. ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值. ②initilizer_list可接受任意多个不同类型的参数. ③借助逗号表达式来展开包,并将返回的结果用于初始化initilizer_list. [编程实验]展开可变参数模板函数的参数包 #include <iostream>

第20课 可变参数模板(1)_模板参数包和函数参数包

1.  参数包(parameter pack) (1)模板参数包(以tuple为例):template<typename- Elements>class tuple ①Elements标识符的左侧使用了省略号,在C++11中Elements被称为"模板参数包",表示可以接受任意多个参数作为模板参数. ②编译器将多个模板参数打包成"单个"的模板参数包,如tuple<int, char, double>实例化模板类时,Element就是包含int

C++11 可变参数模板构造string列表

#include <iostream> #include <cstdint> #include <list> #include <string> template<typename T> typename std::enable_if<std::is_integral<T>::value, std::string>::type to_string(const T & val) { return std::to_st

C++反射机制:可变参数模板实现C++反射

1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在coding.net的仓库地址.   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的.

可变参数模板用法

//可变参数模板 //可变参数模板,可以创建可接受可变数量参数的模板函数和模板类 //本程序通过模板函数来实例一下可变参数模板的基本用法 #include<iostream> using namespace std; void one(){}//当最后一个参数传完后,需要一个无参的重载版本 template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了 void one(T v) { cout << v <

C++的可变参数模板函数

可变参数模板函数写法: 模板参数里写typename... args,表明args是一个可变参数. 之后再函数参数里args后面也要加...,以表示该参数为可变参数. 函数参数中对于args的修饰,会扩展到所有该args的参数,比如下面代码: //可变参数模板函数使用方法1:递归调用,每次将可变参数规模变小直到为0 template<typename T> void print(const T& x) { cout << "最后一次调用print,输出:"

《C++11/14高级编程Boost程序库探秘》之第1章全新的C++语言(三)学习记录

<C++11/14高级编程Boost程序库探秘>之第1章全新的C++语言(三)学习记录 1.7函数式编程 函数式编程是与面向过程编程.面向对象编程和泛型编程并列的一种编程范式,它基于λ演算理论,把计算过程视为数学函数的组合运算. 1.7.1 lambda表达式 基本形式为: [](params){...} []称为lambda表达式引出操作符,圆括号里是函数的参数,花括号内则是函数体,可以使用任何C++语句. lambda表达式的类型称为闭包,无法直接写出,所以通常需要使用auto的类型推导功