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