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

时间:2019-02-01 18:52:47

标签: c++

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

这是我的Statement类现在的样子

  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_int中传递了哪种类型的值,以便可以调用正确的基础函数,例如sqlite_bind_text或{{1}}等。这可能吗? / p>

1 个答案:

答案 0 :(得分:3)

  

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

您所知道的类型。是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,但是模板肯定不会导致这种情况下,简单的代码。”我同意,但是专注于提倡超载;)。