From 9d6e4318302b5967227ab8899bf29eb44873610d Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Thu, 07 Dec 2017 06:58:11 +0000
Subject: [PATCH] 修正GCC下的编译错误
---
include/qtl_common.hpp | 57 ++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 44 insertions(+), 13 deletions(-)
diff --git a/include/qtl_common.hpp b/include/qtl_common.hpp
index 6966a07..df0c144 100644
--- a/include/qtl_common.hpp
+++ b/include/qtl_common.hpp
@@ -96,23 +96,26 @@
return bind_string_helper<string_type>(std::forward<string_type>(value));
}
+template<typename Command>
+inline void bind_param(Command& command, size_t index, const std::string& param)
+{
+ command.bind_param(index, param.data(), param.size());
+}
+
+template<typename Command>
+inline void bind_param(Command& command, size_t index, std::istream& param)
+{
+ command.bind_param(index, param);
+}
+
template<typename Command, typename T>
inline void bind_param(Command& command, size_t index, const T& param)
{
command.bind_param(index, param);
}
-template<typename Command, typename T>
-inline void bind_field(Command& command, size_t index, T& value)
-{
- bind_field(command, index, std::forward<T>(value));
-}
-
-template<typename Command, typename T>
-inline void bind_field(Command& command, size_t index, T&& value)
-{
- command.bind_field(index, std::forward<typename std::remove_reference<T>::type>(value));
-}
+// The order of the overloaded functions 'bind_field' is very important
+// The version with the most generic parameters is at the end
template<typename Command, size_t N>
inline void bind_field(Command& command, size_t index, char (&value)[N])
@@ -160,6 +163,34 @@
inline void bind_field(Command& command, size_t index, std::vector<wchar_t>&& value)
{
command.bind_field(index, bind_string(std::forward<std::vector<wchar_t>>(value)));
+}
+
+template<typename Command, typename T, typename=typename std::enable_if<!std::is_reference<T>::value>::type>
+inline void bind_field(Command& command, size_t index, T&& value)
+{
+ command.bind_field(index, std::forward<T>(value));
+}
+
+template<typename Command, typename T>
+inline void bind_field(Command& command, size_t index, T& value)
+{
+ bind_field(command, index, std::forward<T>(value));
+}
+
+template<typename FieldType, typename Command, typename BindType>
+inline void bind_field(Command& command, size_t index, BindType& value)
+{
+ FieldType temp=FieldType();
+ bind_field(command, index, temp);
+ value=static_cast<BindType>(temp);
+}
+
+template<typename FieldType, typename Command, typename BindType, typename CastFun>
+inline void bind_field(Command& command, size_t index, BindType& value, CastFun&& fun)
+{
+ FieldType temp=FieldType();
+ bind_field(command, index, temp);
+ fun(value, temp);
}
namespace detail
@@ -322,7 +353,7 @@
explicit bind_helper(Command& command) : m_command(command) { }
void operator()(const std::tuple<Types...>& params) const
{
- m_command.bind_param(N-1, std::get<N-1>(params));
+ bind_param(m_command, N-1, std::get<N-1>(params));
(bind_helper<Command, N-1, Types...>(m_command))(params);
}
void operator()(std::tuple<Types...>&& params) const
@@ -343,7 +374,7 @@
explicit bind_helper(Command& command) : m_command(command) { }
void operator()(const std::tuple<Types...>& params) const
{
- m_command.bind_param(0, std::get<0>(params));
+ bind_param(m_command, 0, std::get<0>(params));
}
void operator()(std::tuple<Types...>&& params) const
{
--
Gitblit v1.9.3