Нужно ли мне несколько специализаций шаблонов, если я хочу специализироваться на нескольких видах строк? - PullRequest
0 голосов
/ 10 июня 2010

Например:

template<typename T>
void write(T value)
{
    mystream << value;
}

template<>
void write<const char*>(const char* value)
{
    write_escaped(mystream, value);
}

template<>
void write<char*>(char* value)
{
    write_escaped(mystream, value);
}

template<>
void write<const std::string&>(const std::string& value)
{
    write_escaped(mystream.c_str(), value);
}

Похоже, я делаю это неправильно, особенно два варианта для const и неконстантного char *.Однако я проверил, что если я специализируюсь только на const char *, то передача переменной char * вызовет неспециализированную версию при вызове так в VC ++ 10:

char something[25];
strcpy(something, "blah");
write(something);

Что будетправильный способ сделать это?

Ответы [ 3 ]

1 голос
/ 10 июня 2010

Компилятор C ++ рассматривает тип T и тип const T как разные типы данных. Так как шаблоны работают на спецификациях типов данных. Вы должны написать явные определения для каждого явного типа данных.

1 голос
/ 10 июня 2010

Вы сделали это правильно.

char * и const char * - это два разных типа имен, для каждого из которых требуется своя специализация.

0 голосов
/ 10 июня 2010

Учитывая, что std :: stringstream уже обрабатывает все эти типы, с какой стати вам нужно специализироваться на них?

В дополнение к этому от любого разработчика C ++ не требуетсяиметь дело с const char *.Или используйте memcpy.Просто сделайте из него std :: string.И взять константную ссылку на указанный std :: string.Серьезно, вы пытаетесь написать C здесь?

...