在指针类型的方法上使用大小模板的首选方法

时间:2016-11-24 03:09:37

标签: c++ arrays c++11 overloading c-strings

当重载方法时,我相信当多个匹配可用时,编译器将选择更简单的匹配。

考虑以下代码:

#include <iostream>
#include <string>

struct  A {
    static void foo(const char *str) {
        std::cout << "1: " << str  << std::endl;
    }

    template<int N>  static void foo(const char (&str)[N]) {
        std::cout << "2: " << str  << std::endl;
    }
};

int main()
{
    A::foo("hello");
}

输出为1: hello。然而,如果我注释掉static void foo(const char *str)方法,它会很好地编译并输出2: hello

如何在类上使用这两种方法,使得已知大小的数组将调用模板方法,而指针类型调用非模板方法?

我尝试了以下内容:

struct  A {
    template<class _Ty = char>
    static void foo(const _Ty *str) {
        std::cout << "1: " << str  << std::endl;
    }

    template<int N>  static void foo(const char (&str)[N]) {
        std::cout << "2: " << str  << std::endl;
    }
};

但是g ++给了我以下错误:

In function 'int main()':
17:17: error: call of overloaded 'foo(const char [6])' is ambiguous
17:17: note: candidates are:
6:15: note: static void A::foo(const _Ty*) [with _Ty = char]
10:32: note: static void A::foo(const char (&)[N]) [with int N = 6]

1 个答案:

答案 0 :(得分:1)

正如T.C.所建议的那样:

struct  A {

    template<class T, typename = typename std::enable_if<std::is_same<T, char>::value>::type>
    static void foo(const T * const & str) {
        std::cout << "1: " << str  << std::endl;
    }

    template<int N>  static void foo(const char (&str)[N]) {
        std::cout << "2: " << str  << std::endl;
    }
};

int main()
{
    A::foo("hello1");

    const char *c = "hello2";
    A::foo(c);

    char *c2 = new char[7];
    ::strcpy(c2, "hello3");
    A::foo(c2);

    // does not compile
    // int *c3;
    // A::foo(c3);
}

输出:

2: hello1
1: hello2
1: hello3

我希望我没有模板指针方法,因为它打开了误用意外类型的大门,但我可以忍受这个解决方案。