суббота, 25 июня 2011 г.

сломал голову

как известно под лучшей в мире операционной системой код может быть
  • 32 или 64 битным
  • ASCII или Unicode
два этих требования совершенно ортогональны. Соотв-но вот например у меня есть такой класс:

template <typename T>
class someclass
{
 public:
   template <typename W> void somefunction(const W* filename);
 private:
   template <typename W> const char *get_format_string(int index) const;
};

Тут все просто и очевидно - первый template задает размерность, второй - сhar или wchar_t. Метод get_format_string зовется из somefunction для получения правильных форматных строк для printf например. Заметьте при этом что сам get_format_string не имеет аргументов типа W и вообще служит исключительно для специализации:

template <typename T>
template <typename W>
void someclass<T>::somefunction(const W *filename)
{
  ...
  // вызываем get_format_string
  printf(get_format_string<W>(FORMAT_INDEX1), args);
}

Это компилируется.
Проблема возникает при попытке определить частично специализированный метод get_format_string. Например такое не работает:

template <typename T>
template <>
const char *someclass<T>::get_format_string<char>() const

при компиляции возникает ошибка C2768
И как же будет правильно специализировать такой метод шаблонного класса ?

Update: гугл говорит нам что "частичная специализация шаблонной функции шаблонного класса в чистом виде невозможна" и предлагает использовать костыли в виде traits и прочую boostоподобную упячку. Реальность однако подсказывает что вот такой код, вставленный внутри определения класса, вполне даже работает:

template <typename W>
 const char *get_format_string(int index) const;
template <>
 const char *get_format_string<wchar_t>(int index) const
{
// тело специализированного метода например
}

vs2008 есличо
У меня есть подозрения что главная гордость с++ - шаблоны - на самом деле реализованы в нем крайне через жопу анус мертвого страуса

Комментариев нет:

Отправить комментарий