创建通用插入功能
Creating Generic Insert function
我正在尝试创建一个通用函数,该函数可以使用表名和值并返回查询中,并提出了以下内容:
struct any {
enum type {Int, Float, String};
any(int e) { m_data.INT = e; m_type = Int;}
any(float e) { m_data.FLOAT = e; m_type = Float;}
any(char* e) { m_data.STRING = e; m_type = String;}
type get_type() const { return m_type; }
int get_int() const { return m_data.INT; }
float get_float() const { return m_data.FLOAT; }
char* get_string() const { return m_data.STRING; }
private:
type m_type;
union {
int INT;
float FLOAT;
char *STRING;
} m_data;
};
template<typename ...Args>
std::string GetInsertString(const std::string& tableName, Args... args)
{
std::string insertString = "INSERT INTO ";
insertString += tableName;
insertString += " VALUES(";
std::vector<any> vec = {args...};
std::ostringstream ss;
for (unsigned i = 0; i < vec.size(); ++i)
{
switch(vec[i].get_type())
{
case any::Int:
ss.str("");
ss << vec[i].get_int();
insertString += ss.str() + ",";
break;
case any::Float:
ss.str("");
ss << vec[i].get_float();
insertString += ss.str() + ",";
break;
case any::String:
ss.str("");
insertString += "'" + std::string(vec[i].get_string()) + "'," ;
break;
}
}
insertString.pop_back();
insertString += ");";
return insertString;
}
基于此链接的类别是哪个类别,我如何在包装的variadic模板参数列表中迭代?
但是问题是我无法将std::string
类型作为variadic参数传递给此函数,因为我们在>>>>>>>>>>>类中的 std::string
type CC_2 type作为构造值的参数,用于插入查询
您可以使用虚拟基类,模板包装器和智能指针的写作,如下所示
#include <string>
#include <vector>
#include <memory>
#include <sstream>
#include <iostream>
struct anyBase
{ virtual int unusedVirt () { return 0; }; };
template <typename T>
struct anyW : public anyBase
{
T val;
anyW (T const & v0) : val{v0} { }
};
struct any
{
public:
enum type { Int, Float, String };
any (int e)
: m_type{Int}, m_data{new anyW<int>(e)} { }
any (float e)
: m_type{Float}, m_data{new anyW<float>(e)} { }
any (char const * e)
: m_type{String}, m_data{new anyW<std::string>(e)} { }
any (std::string const & e)
: m_type{String}, m_data{new anyW<std::string>(e)} { }
any (any const & a) : m_type{a.m_type}, m_data{nullptr}
{
switch ( m_type )
{
case Int:
m_data.reset(new anyW<int>(a.get_int()));
break;
case Float:
m_data.reset(new anyW<float>(a.get_float()));
break;
case String:
m_data.reset(new anyW<std::string>(a.get_string()));
break;
}
}
type get_type () const { return m_type; }
int get_int () const
{ return dynamic_cast<anyW<int>*>(m_data.get())->val; }
float get_float () const
{ return dynamic_cast<anyW<float>*>(m_data.get())->val; }
std::string const & get_string () const
{ return dynamic_cast<anyW<std::string>*>(m_data.get())->val; }
private:
type m_type;
std::unique_ptr<anyBase> m_data;
};
template<typename ...Args>
std::string GetInsertString(const std::string& tableName, Args... args)
{
std::string insertString = "INSERT INTO ";
insertString += tableName;
insertString += " VALUES(";
std::vector<any> vec = {args...};
std::ostringstream ss;
for (unsigned i = 0; i < vec.size(); ++i)
{
switch(vec[i].get_type())
{
case any::Int:
ss.str("");
ss << vec[i].get_int();
insertString += ss.str() + ",";
break;
case any::Float:
ss.str("");
ss << vec[i].get_float();
insertString += ss.str() + ",";
break;
case any::String:
ss.str("");
insertString += "'" + std::string(vec[i].get_string()) + "'," ;
break;
}
}
insertString.pop_back();
insertString += ");";
return insertString;
}
int main ()
{
std::cout << GetInsertString("fooTable", 1, 2.2f, "3", std::string("4"))
<< std:: endl;
// print INSERT INTO fooTable VALUES(1,2.2,'3','4');
}
观察:
此解决方案应该与C 11一起使用
我已经统一了
char *
和std::string
案例;我认为这是一个坏主意注册chat *
使用
std::unique_ptr
您需要Copy_Constructor一个更好的解决方案可能是等待传入(C 17,如果没有错)
std::variant
typeof
您可以使用typeof
并添加开关案例。例如,在新的Java中,您可以自动化一个半循环,如果我没记错的话,同样可以看到某种循环。
相关文章:
- 如何编写用于多映射插入和擦除功能的 API?
- 如何将标准::矢量插入具有自定义排序功能的 std::set 中
- C++插入排序错误功能不起作用
- 插入运算符的过载与使用二传手功能相比
- 使用链表.为什么我的插入功能不起作用?
- 二叉树插入功能不适用于 10 个条目
- 插入功能保持重新创建根节点
- 如何使用字符串更改此插入功能以在链接列表中工作
- 双链接列表插入功能C
- LLVM插入功能调用到另一个函数中
- 创建通用插入功能
- 有什么方法可以将此功能分开并插入空间
- 自定义char*插入功能多次运行时会产生运行时错误
- 哈希表打印和插入功能
- 二叉搜索树在插入功能方面有问题
- C++中的插入器和提取器功能
- 插入功能指向新数据
- QVECTOR插入功能后无法访问点
- GCC vs Clang:将功能与-FPIC一起插入
- 插入功能模板专业化