Шаблон явной реализации метода с другим телом - PullRequest
0 голосов
/ 22 июня 2011

У меня есть шаблон класса с конструктором, который принимает std::vector<T>. Для каждого объекта, кроме одного, я хочу, чтобы он выполнял операцию A. Но для этого одного объекта я хочу, чтобы он делал другие вещи B.

Есть ли возможность создать явное создание экземпляра только конструктора для шаблонного класса? Я надеюсь, что это описано достаточно точно.

Привет

Обновление: теперь я реализовал контрольный пример:

//header

Container(const std::vector<T>& source)
{...}

//source code

template <> Container<int>::Container(const std::vector<int>& source)
{
    throw 42;
}

Этот пример компилируется, но не работает. Я экспортирую это в dll и хочу, чтобы он вызывался всякий раз, когда я пытаюсь создать экземпляр класса с универсальным параметром int. Но, как и сейчас, он вызывает только стандартный конструктор, используемый для каждого другого объекта. Могу ли я внести изменения в объявление?

Обновление: мне удалось! Просто пришлось скопировать его в заголовочный файл.

Обновление: ОК, теперь у меня другая проблема. Я могу специализироваться на «простых» типах, но не на шаблонах. Я попробовал это так:

template<typename T>
Container<MyClass<T>>::Container(const std::vecror<MyClass<T>>& source)
{...}

Я хочу специализировать его для каждого объекта MyClass, но сам MyClass сможет работать как шаблон.

Ответы [ 4 ]

5 голосов
/ 22 июня 2011

Ваш вопрос не ясен. Возможно, вы имеете в виду что-то вроде следующего?

template <typename T>
class Foo
{
public:
    Foo() { std::cout << "standard" << std::endl; }
};

template <>
Foo<float>::Foo() { std::cout << "random" << std::endl; }  // Special case

...

Foo<int>    f1;  // Prints "standard"
Foo<float>  f2;  // Prints "random"
0 голосов
/ 22 июня 2011

Если я правильно понял ваш вопрос, вы хотите сделать это:

template< typename T >
struct A
{
  template< typename P >
  A( std::vector< P > &v )
  {
  }
};
0 голосов
/ 22 июня 2011

Нет никакого способа сделать явную реализацию шаблона конструктора - это было рассмотрено здесь: C ++ вызывает явный конструктор шаблона

0 голосов
/ 22 июня 2011

Какой компилятор? У меня были проблемы с созданием шаблона с какой-то старой версией компилятора g ++ и с компилятором Solaris и HPUX c ++. template <> используется для указания явного экземпляра. Давно у меня нет специализированного только метода класса.

Вы пробовали?

template <> TemplateClass<InstanciedType>::TemplateClass()  {
   ...
}

Где TemplateClass - это экземпляр класса шаблона, который вы хотите переопределить.

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