Шаблон специализирующей функции для std :: string и char * - PullRequest
4 голосов
/ 12 января 2011

Как видно из заголовка, я хочу специализировать шаблон функции для указателя строки и символа, пока что я сделал this , но я не могу понять, как передать параметры строки по ссылке.

#include <iostream>
#include <string.h>
template<typename T> void xxx(T param)
{
std::cout << "General : "<< sizeof(T)  << std::endl;
}

template<> void xxx<char*>(char* param)
{
std::cout << "Char ptr: "<< strlen(param) << std::endl;
}

template<> void xxx<const char* >(const char*  param)
{
std::cout << "Const Char ptr : "<< strlen(param)<<  std::endl;
}

template<> void xxx<const std::string & >(const std::string & param)
{
std::cout << "Const String : "<< param.size()<<  std::endl;
}

template<> void xxx<std::string >(std::string param)
{
std::cout << "String : "<< param.size()<<  std::endl;
}


int main()
{
        xxx("word");
        std::string aword("word");
        xxx(aword);

        std::string const cword("const word");
        xxx(cword);
} 

Также template<> void xxx<const std::string & >(const std::string & param) вещь просто не работает.

Если я переставил шаблон для принятия параметров как T&, тогда char * должен быть char * &, что не подходит для статического текста в коде.

Пожалуйста, помогите!

Ответы [ 3 ]

9 голосов
/ 12 января 2011

Не работает ли следующее?

template<>
void xxx<std::string>(std::string& param)
{
    std::cout << "String : "<< param.size()<<  std::endl;
}

И то же самое для const std::string?

Тем не менее, не специализируйте шаблон функции , если у вас есть выбор (и вы обычно делаете!).Вместо этого просто перегрузите функцию:

void xxx(std::string& param)
{
    std::cout << "String : "<< param.size()<<  std::endl;
}

Обратите внимание, это , а не шаблон.В 99% случаев это нормально.

(Что-то еще, C ++ не имеет заголовка <string.h>, за исключением обратной совместимости с C. Заголовок C-строки в C ++ называется <cstring>(обратите внимание на ведущий c), но из вашего кода это выглядит так, как будто вы на самом деле имеете в виду заголовок <string> (без начального c).)

0 голосов
/ 12 января 2011

действительно рискованно пытаться кодировать, используя преобразования типов на основе компилятора

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

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

0 голосов
/ 12 января 2011

Вот пример того, что я нахожу удивительным:

#include <iostream>

template<typename T> void f(T param) { std::cout << "General" << std::endl ; }
template<> void f(int& param) { std::cout << "int&" << std::endl ; }

int main() {
  float x ; f (x) ;
  int y ; f (y) ;
  int& z = y ; f (z) ;
}

Это напечатано "Общие" 3 раза. Первый раз (float) ожидается, третий раз (int &) - сюрприз. Почему это не работает?

...