各种参数类型的C ++类模板方法

peer_2_peer_2

我正在包装一些sqlite的东西,我想知道是否可以使用模板来避免使用新方法包装每种类型。但是,我绝对迷路了,摸索着模板。我找不到很好的教程。

这就是我的Statement类现在的样子

class Statement {
  public:
    Statement();
    ~Statement();
    void BindInt(int index, int value);
    void BindInt(std::string name, int value);
    void BindInt64(int index, int value);
    void BindInt64(std::string name, int value);
    void BindText(int index, std::string value);
    void BindText(std::string name, std::string value);
};
Statement::Statement(){}
Statement::~Statement(){}
void Statement::BindInt(int index, int value){}
void Statement::BindInt(std::string name, int value){}
void Statement::BindInt64(int index, int value){}
void Statement::BindInt64(std::string name, int value){}
void Statement::BindText(int index, std::string value){}
void Statement::BindText(std::string name, std::string value){}

我觉得我可以写一些其他通用的东西,例如

  class Statement {
      public:
        Statement();
        ~Statement();
        template<class T, class V>
        void Bind(T param, V value);
    };
    Statement::Statement(){}
    Statement::~Statement(){}
    template<class T, class V>
    void Statement::Bind(T index, T value){}

但是我将需要知道传入的是哪种类型的值,value以便可以调用正确的基础函数,例如sqlite_bind_intsqlite_bind_text,等等。这可能吗?

maximum_prime_is_463035818

但是我需要知道在值中传递了哪种类型的值...。

您确实知道类型。是的V

...这样我就可以调用正确的基础函数,例如sqlite_bind_int或sqlite_bind_text等。这可能吗?

如果您需要为传递的每种类型调用不同的方法,因为value使用模板不会带来太多好处。您最终将为每种可能的类型编写一个特殊化名称以调用相应的sqlite_bind_XY函数。通过重载,您可以轻松地获得相同的效果:

class Statement {
  public:
    Statement();
    ~Statement();        
    void Bind(int index, int value);               // aka BindInt
    void Bind(std::string name, int value);
    void Bind(int index, int64_t value);           // aka BindInt64
    void Bind(std::string name, int64_t value);    
    void Bind(int index, std::string value);       // aka BindText
    void Bind(std::string name, std::string value);
};

请注意,我不得不改变int,以int64_t使他们不同。您将在模板上遇到同样的问题。有时,没有明显的方法可以使参数不同,然后可以使用标签:

class Statement {
  public:
    struct text_tag{};
    struct int_tag{};
    struct int64_tag{};
    Statement();
    ~Statement();        
    void Bind(int_tag,int index, int value);               // aka BindInt
    void Bind(int_tag,std::string name, int value);
    void Bind(int64_tag,int index, int value);           // aka BindInt64
    void Bind(int64_tag,std::string name, int value);    
    void Bind(text_tag,int index, std::string value);       // aka BindText
    void Bind(text_tag,std::string name, std::string value);
};

粗略的经验法则是:要为每种类型做不同的事情时,请使用重载;而要为每种类型做相同的事情时,请使用模板。

PS:正如@Mils Budnek指出的那样,“您可以为类IMO提供一个更好的接口,但是在这种情况下,模板肯定不会导致更简单的代码。” 我同意,但是专注于倡导超载;)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

非类型模板参数允许各种函数类型?

不使用模板参数的C ++模板类方法

以类为参数调用模板类的静态模板方法

模板类对象作为模板类方法中的参数

类模板方法的特化,类型名是类模板 - 错误:参数的类型/值不匹配

通过它的模板类重载 C++ 模板类方法

C++:递归匹配参数类型与类模板类型

如何检查模板类方法的返回类型?

可变参数方法的嵌套调用以及类模板的附加非类型模板参数

在类模板参数上调用模板方法

具有取决于模板参数的方法的模板类

C ++-在模板类中具有模板化参数的模板静态方法

用C ++处理类模板及其类型的方法是什么?

依赖于特定类类型的C ++模板方法?

模板类中的Cython C ++静态方法

使用参数实例化模板类的类成员的正确方法

混合模板类和模板方法时出现C ++错误

C ++-在单独的文件中实现内部模板类的模板方法

Haskell多参数类(模板类型类)

C ++ 11翻译可变参数模板以推断类类型

当可变参数模板类从模板参数继承时,在调用基类型的方法时扩展参数包

C++模板类,基于typename改变类方法的行为

C ++ 11类模板方法专业化和可变参数模板

如何确定从类模板继承的模板参数的基础模板类型?

问:带有常规类型或模板模板参数的模板类

如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

C ++模板类=类型名

c ++模板参数类型推断

C ++模板参数类型推导