【问题标题】:Is it good to have a member template function inside a non-template class in c++?在 c++ 中的非模板类中拥有成员模板函数是否很好?
【发布时间】:2011-02-03 11:28:30
【问题描述】:

我想知道在 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();
}

不知是否合适?

【问题讨论】:

    标签: c++ class templates function


    【解决方案1】:

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

    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" );
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        模板化一个函数是一种用不同参数类型重载它的简单方法,这是完全可以接受的。从这个意义上说,甚至可以在非模板类中模板化单个成员函数,或者从非模板类调用模板函数。没有什么暧昧的地方

        【讨论】:

          【解决方案4】:

          如果您有许多具有相似签名的方法,只是因类型而异,则可以使用模板方法:

          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 允许方法、函数或算法在不更改算法的情况下对不同类型的对象进行操作。这也适用于接口。

          【讨论】:

            【解决方案5】:

            是的,这很好,当然,像往常一样,您最好尽可能多地从模板中分解出来。

            例如:

            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;
            };
            

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

            【讨论】:

              猜你喜欢
              • 2019-04-12
              • 1970-01-01
              • 2010-12-13
              • 2023-01-10
              • 1970-01-01
              • 1970-01-01
              • 2020-11-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多