【问题标题】:Specializing template member function to handle both std::string and char[] arguments专门处理 std::string 和 char[] 参数的模板成员函数
【发布时间】:2012-03-04 21:41:51
【问题描述】:

我有一个类的模板成员函数,用于将各种不同类型添加到列表中,并针对特定类型进行特殊处理和包装(所有内容最终都包装在 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::strings 处理,但这会在模板参数类型推导中作为某种 const char 数组引用弹出。所以我得到一个关于没有函数的错误,即使有上面​​的 std::string 专业化。我对模板数组大小推导很熟悉,所以我正在尝试使用该格式来创建一个可以处理此类事情的 addvar,例如:

template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}

但是由于非法引用数组的编译器错误,事情变得非常糟糕。这是在 VC++ 2010 中,如果有任何具体的奇怪之处,但我觉得我在这里搞砸了一些基本的东西。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您不能部分特化模板函数,因此它必须是一个重载(= 一个不与初始 addvar 模板函数共享任何内容的模板):

    template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/}
    

    【讨论】:

    • 啊哈,我用 addvar 试过了,但是没有用,但是没有 就可以了。谢谢!
    【解决方案2】:
    template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/}
                                                         ^
    

    const char 之后删除&amp;,您正试图以这种方式专门针对引用数组,这不是您想要的(并且无论哪种方式都是非法的)。

    【讨论】:

    • 这给了我错误“非法使用显式模板参数”
    【解决方案3】:

    函数如下所示:

    template <std::size_t N>
    void foo(const char (&a)[N])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多