Специализировать шаблон void-функции на const char [N] - PullRequest
0 голосов
/ 07 августа 2011

У меня есть шаблонная функция, которую я хочу специализировать foo до const char[N] (жестко закодированные строки)

    template<typename T>
const std::string foo() ;

    template<typename T,int N>
const std::string foo<T[N]>() { return "T[N]"; } //this doesn't work for const char[12]

    template<>
const std::string foo<const char*>() { return "Const char"; } //this doesn't work for const char[12]

   template<typename T>
   void someother function(T obj)
   {

   string s = foo<T>(); //I want to overload when T is const chat[N]
   }

   function("Hello World");  //When calling like this the type is const char[12]

Я думал, что могу сделать что-то, как было сделано Здесь .
Но это не так хорошо работает, потому что я не передаю параметр, просто шаблонный тип.
Я мог бы сделать это так, но просто нет причин передавать параметр этой функции.

Пример не работает, потому что я не передаю переменную. Пробовал несколько вещей, но не могу заставить его работать.

Это единственная специализация, которую я не могу решить. Я специализировал функцию для типов int, string и других типов, и они работают нормально.

 error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const __cdecl foo<char const [12]>(void)" 

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

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

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

#include <typeinfo>
#include <iostream>

namespace detail {

  template <typename T> struct foo_helper {
    static std::string helper() {
      return typeid(T).name();
    }
  };

  template <int N> struct foo_helper<const char [N]> {
    static std::string helper() {
      return "Const Char Array";
    }
  };
}

template <typename T> std::string foo(T& obj) {
  return detail::foo_helper<T>::helper();
}

int main() {
  std::string x;
  const char c[] = "hard coded";
  std::cout << foo(x) << std::endl;
  std::cout << foo(c) << std::endl;
}

Это вызывает специализацию правильно для константной строки.Я также изменил T obj на T& obj, чтобы g ++ передавал статические строки как массивы, а не как указатели.Для более подробной информации о частичной специализации, смотрите http://www.gotw.ca/publications/mill17.htm

1 голос
/ 07 августа 2011

Вы не можете. Это невозможно. Вам потребуется частичная специализация, чтобы специализироваться на const char(&)[N], но, поскольку вы не можете частично специализировать функции, это невозможно. Вы всегда можете перегрузить его.

...