Обертка создания объекта для класса шаблона - PullRequest
2 голосов
/ 20 января 2010

Учитывая шаблон класса как таковой:

template <typename TYPE>
class SomeClass {
 public:
  typedef boost::intrusive_ptr<SomeClass<TYPE> > Client_t;
  inline Client_t GetClient() { return Client_t(this); }
};

SomeClass предназначен только для использования через ссылки указателей, возвращаемые SomeClass :: GetClient (). Что делает естественным написание функции-оболочки вокруг создания следующим образом:

template <typename TYPE>
SomeClass<TYPE>::Client_t New_SomeClass() { 
  return (new SomeClass<TYPE>)->GetClient(); 
}

Компиляция вышеуказанного кода в GCC 4.4:

SomeClass<int>::Client_t some_class = New_SomeClass();

Дает ошибку "New_SomeClass" не был объявлен в этой области "

Теперь я не являюсь мастером шаблонов, поэтому здесь могут быть детали, о которых я не знаю, но я предполагаю, что вообще не могу использовать такую ​​конструкцию из-за того, что C ++ не разрешить перегрузку по типу возврата.

Полагаю, макрос ... дрожь ... решит эту проблему:

#define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient())

auto some_class = NEW_SOMECLASS(int);

Но должен быть разумный способ разоблачить создание объектов шаблонного класса, не прибегая к макросам или другим громоздким конструкциям?

Ответы [ 2 ]

2 голосов
/ 20 января 2010
SomeClass<int>::Client_t some_class = New_SomeClass<int>();

Поскольку параметры шаблона для New_SomeClass не зависят от параметра функции, вы должны указать их. Однако сообщение об ошибке, которое вы сообщили, немного странно для этой проблемы, поэтому у вас может быть что-то еще.

Или мое предпочтение вместо функции New_SomeClass:

template<class T>
struct SomeClass {
  typedef boost::intrusive_ptr<SomeClass> Client;
  inline Client client() { return Client_t(this); }

  static Client create() { return (new SomeClass())->client(); }

private:
  SomeClass(); // can be public too, if you really need it accessible
};

//...
SomeClass<int>::Client some_class = SomeClass<int>::create();

Хотя это, по сути, просто перемещает функцию «в» класс, я нахожу ее в целом чище.

В любом случае, если ваш компилятор поддерживает 0x 'auto', вы можете использовать его:

auto some_class = SomeClass<int>::create();
0 голосов
/ 20 января 2010

вы можете попробовать использовать тип по умолчанию для параметра типа шаблона

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