Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我想专门处理几种类型的字符串,是否需要多个模板专门化?_C++_Templates_Template Specialization - Fatal编程技术网

C++ 如果我想专门处理几种类型的字符串,是否需要多个模板专门化?

C++ 如果我想专门处理几种类型的字符串,是否需要多个模板专门化?,c++,templates,template-specialization,C++,Templates,Template Specialization,例如: 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) {

例如:

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);
}

做这件事的正确方法是什么?

你做得很正确


char*
const char*
是两种不同的类型名,它们各自需要专门化。

C++编译器将类型T和类型const T视为不同的数据类型
因为模板工作于数据类型规范。您必须为每个显式数据类型编写显式定义。

既然std::stringstream已经处理了所有这些类型,您究竟为什么需要专门处理它们


除此之外,任何C++开发人员不必要求处理const char。或者使用memcpy。只要把它做成一个std::字符串。并获取对所述std::string的常量引用。说真的,你想在这里写C吗?

请使用简单的重载而不是专门化。还有一点,字符串的专门化(正如avakar所说,作为重载更好)应该采用常量引用。好的,关于重载的观点很好。一些谷歌搜索揭示了为什么这样更好的各种原因。还将修复conststring&.@Neil,因为显式专门化将不再自动使用。他必须将模板的参数类型更改为参考,并同样调整其他专业以实现此功能:(“要求”可能有点强-如果有其他替代覆盖/专业,则可能需要单独的覆盖/专业。a)因为我需要特别处理字符串,因为stringstream不提供一种方法,如果我写的字符串中有空格(据我所知),就可以读回它。b)因为我不想在我的字符串文本中添加一个“STD:String()),因为在编写C ++代码时,即使是在使用C++ API的时候,也不需要添加一个“STD::String())。(我就是)如果你想读回你写的字符串,为什么不保留原来的字符串呢?至于memcpy,你给出的(strcpy)例子仍然是一个令人憎恶的例子。固定大小的缓冲区正在请求溢出。无论如何,Strcpy本身是不安全的。为什么不直接使用char[]buffer=“lols”?而且,如果你不记得构造一个对象,那么你会得到一个很好的编译时错误,很容易被捕获,而且考虑到std::string在const char*.a上的安全性,这绝对是值得的,因为程序不是在写和读之间运行的:)b)我为我对char[]的厌恶深表歉意。c) 如果存在同名的模板函数(这是问题的关键),则不会出现编译器错误。
char something[25];
strcpy(something, "blah");
write(something);