专门化模板成员函数来处理std::string和char[]参数
Specializing template member function to handle both std::string and char[] arguments
我有一个类的模板成员函数,用于将各种不同的类型添加到列表中,并对特定类型进行特殊处理和包装(所有内容最终都包装在var对象中):
template<typename V> const var& addvar(const V& v);
template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/}
然而,我将像这样传递字符串(好吧,const char数组):
object.addvar("lol");
尽管我将所有内容都作为std::string处理,但在模板参数类型推导中,这会作为某种const char数组引用弹出。因此,我得到了一个错误,即没有为其提供函数,即使使用了上述std::string专用化。我熟悉模板数组大小推导,所以我试图使用这种格式来创建一个addvar,它可以处理这样的事情,比如:
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
但是,由于非法引用数组的编译器错误,情况变得非常糟糕。这是在VC++2010中,如果有什么特别的奇怪之处的话,但我觉得我把一些基本的东西搞砸了。
您不能部分专门化模板函数,因此它必须是一个重载(=一个与初始addvar
模板函数不共享任何内容的模板):
template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/}
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
^
在const char
之后删除&
,您正试图以这种方式专门化引用数组,这不是您想要的(无论哪种方式都是非法的)。
函数如下所示:
template <std::size_t N>
void foo(const char (&a)[N])
但你的问题是,你不能部分地专门化一个函数。然而,您可以定义一个简单的重载,它将是首选的,并从编译器中调用。
相关文章:
- 使用char类型将decimal转换为string,将string转换为decimal
- std::string 构造函数如何处理固定大小的 char[]?
- C++:将模板类型 char 转换为 std::string
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 为什么std::string没有(显式)const char*强制转换
- 将 std::string 转换为 const char* 用于 printf 消耗
- 我可以使用istream_iterator将<char>一些 istream 内容复制到 std::string 中吗?
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- C++:使用委托构造函数时选择"const char *"与"std::string&qu
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 从类方法返回 "const char*" 作为 std::string&
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将 'hana::string' 转换为 'constexpr const char (&)[]'
- C++中的"string()+char"
- Picky STD :: String Char Array构造函数
- "std::string + char"表达式会创建另一个 std::string 吗?