const char array (c style string) специализация шаблона - PullRequest
4 голосов
/ 01 ноября 2011

Я хочу иметь возможность специализироваться на основе постоянной строки стиля c. Проблема в том, что когда я вызываю мою шаблонную функцию, типом является const char [N], где «N» - это размер строки +1 (нулевой символ). Как я могу специализироваться для всех строк в стиле c?

Следующий код отображает проблему. Вы можете видеть, что специализация для const char [15] совпадает с "const char [15]", но для "const char [5]" она переходит к Generic.

Есть ли способ сделать это?

template <typename T>
struct Test {
  static const char* type() { return "Generic"; }
};

template <>
struct Test<const char*> {
  static const char* type() { return "const char*"; }
};

template <>
struct Test<const char[]> {
  static const char* type() { return "const char[]"; }
};

template <>
struct Test<const char[15]> {
  static const char* type() { return "const char[15]"; }
};

template <>
struct Test<char*> {
  static const char* type() { return "char*"; }
};

template <>
struct Test<char[]> {
  static const char* type() { return "char[]"; }
};

template <typename T>
void PrintType(const T& expected) {
  std::cerr << expected << " type " << Test<T>::type() << std::endl;
}
int main(int argc, char* argv[]) {
  const char* tmp = "const char*";
  PrintType(tmp);
  PrintType("const char[]");
  PrintType("const char[15]");
  PrintType("const char[5]");
}

вывод при запуске в Windows 7 - VS 2008

const char* type const char*
const char[] type Generic
const char[15] type const char[15]
const char[5] type Generic

1 Ответ

13 голосов
/ 01 ноября 2011

Специализация для любого массива char s:

template< std::size_t N >
struct Test< const char[N] > { ... };

Однако вы больше не можете возвращать char* из type(), если только вы не напишите больше метафункций для преобразования нетипичного параметра шаблона в его текстовое представление.

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