Хорошо ли иметь функцию шаблона члена внутри не шаблонного класса в c ++? - PullRequest
4 голосов
/ 01 апреля 2010

Интересно, будет ли хорошей практикой иметь функцию шаблона члена внутри не шаблонного класса в 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 ]

6 голосов
/ 01 апреля 2010

Это вполне законное использование шаблонных функций. Кроме того, нет проблем с использованием шаблонных функций-членов не шаблонного класса. Например:

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" );
4 голосов
/ 01 апреля 2010

Если функция-член логически принадлежит вашему классу, а тип шаблона относится только к этой функции (и не имеет никакого отношения к остальной части вашего класса), я не вижу причин не делать этого.

1 голос
/ 02 апреля 2010

Да, это хорошо, конечно, как обычно, вам лучше разложить как можно больше из шаблона.

Например:

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

Это снимает скуку конверсии с колен пользователя.

1 голос
/ 01 апреля 2010

Если у вас есть много методов с похожими сигнатурами, различающимися только по типу, шаблонный метод - путь:

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 позволяет методу, функции или алгоритму работать с различными типами объектов без изменения алгоритма. Это также может относиться и к интерфейсам.

1 голос
/ 01 апреля 2010

Шаблонирование функции - это простой способ перегрузить ее различными типами аргументов, что вполне приемлемо. В этом смысле даже приемлемо шаблонировать одну функцию-член в не шаблонном классе или вызывать шаблонную функцию из не шаблонного класса. В этом нет ничего двусмысленного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...