专门化模板成员函数来处理std::string和char[]参数

Specializing template member function to handle both std::string and char[] arguments

本文关键字:string char 参数 std 成员 函数 处理 专门化      更新时间:2023-10-16

我有一个类的模板成员函数,用于将各种不同的类型添加到列表中,并对特定类型进行特殊处理和包装(所有内容最终都包装在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])

但你的问题是,你不能部分地专门化一个函数。然而,您可以定义一个简单的重载,它将是首选的,并从编译器中调用。