在c ++中的非模板类中使用成员模板函数是否合适?

时间:2010-04-01 17:40:34

标签: c++ class templates function

我想知道在c ++中的非模板类中使用成员模板函数是否是一个好习惯?为什么呢?

我正在尝试做这样的事情

in classA.h:
classA
{
   public:
      member_func1();
      member_func2();
};

in classA.cpp:
template <class T> share_func();

classA::member_func1()
{
   call share_func();
}
classA::member_func2()
{
   call share_func();
}

我想知道它是否合适?

5 个答案:

答案 0 :(得分:6)

这是模板功能的完全合法使用。此外,使用非模板类的模板化成员函数也没有问题。例如:

class A {
   public:
     void say_hello() { cout << "Hello World" << endl; }
     template<T> print_it( T arg ) { cout << "Argument: " << arg << endl; }
};
...
A a;
a.say_hello();
a.print_it( 3.14159 );
a.print_it( "A string" );

答案 1 :(得分:4)

如果成员函数在逻辑上属于您的类,并且模板类型仅特定于该函数(并且与您的其他类没有任何关系),我认为没有任何理由不这样做。< / p>

答案 2 :(得分:1)

模板化函数是一种使用不同参数类型重载它的简单方法,这是完全可以接受的。从这个意义上说,在非模板类中模拟单个成员函数,或者从非模板类调用模板函数甚至是可以接受的。关于它没有任何含糊之处

答案 3 :(得分:1)

如果您有许多具有相似签名的方法,只能按类型进行更改,则可以使用模板方法:

struct Example
{
   void load_from(std::istream&);
   void load_from(Database_Table&);
   void load_from(Some_Device&);
};

模板方法可以进行一些扩展:

struct Example_Template_Method
{
    template <class Input_Source>
    void load_from(Input_Source&);
};

这里的关键点是template允许方法,函数或算法在不改变算法的情况下对不同类型的对象进行操作。这也适用于接口。

答案 4 :(得分:1)

是的,它很好,当然像往常一样,你最好尽可能多地分解模板。

例如:

class Tokens
{
public:

  void add(const char* c);
  void add(const std::string& s);

  template <class T>
  void add(T const& t)
  {
    this->add(boost::lexical_cast<std::string>(t));
  }

private:
  std::vector<std::string> mTokens;
};

这减轻了用户膝盖转换的乏味。