首页 > 解决方案 > 以数组为参数的模板特化

问题描述

我正在尝试专门化此功能模板:

template< typename T, std::size_t Size>
T Max(T(&pArr)[Size]) {
    T result{ *pArr };

    for (size_t i{ 1 }; i < Size; i++) {
        result = pArr[i - 1] > pArr[i] ? pArr[i - 1] : pArr[i];
    }
    return result;
}

我想将它专门用于 const char*。我尝试了很多东西,但其中任何一个都有效。尝试这种方式时:

template<std::size_t SIZE>
const char* Max<const char*>(const char *(&pArr)[SIZE]) {
    char result{ *pArr };

    for (size_t i{ 1 }; i < SIZE; i++) {
        result = pArr[i - 1] > pArr[i] ? pArr[i - 1] : pArr[i];
    }
    return result;
}

我收到错误消息:“Max”:非法使用显式模板参数。有人可以帮我吗?我想了解它为什么不起作用以及如何使它起作用。

谢谢!

标签: c++c++11templatestemplate-specialization

解决方案


您不能对函数进行部分特化。但是您不必这样做,因为函数已经支持重载。您只需要为const char*. 您的版本有两个错误。

  1. 您已将结果变量声明为,char但它应该是const char*.
  2. 使用 , 比较随机指针>并没有给出有意义的结果。你必须决定如何称呼一个比另一个大。

链接:https ://gcc.godbolt.org/z/VKE4Jy


#include<cstring>

template< typename T, std::size_t Size>
T Max(T(&pArr)[Size]) {
    T result{ *pArr };

    for (size_t i{ 1 }; i < Size; i++) {
        result = pArr[i - 1] > pArr[i] ? pArr[i - 1] : pArr[i];
    }
    return result;
}

bool greater(const char* first, const char* second){
    return strlen(first) > strlen(second);
}

template<std::size_t SIZE>
const char* Max(const char *(&pArr)[SIZE]) {
    const char* result{ *pArr };

    for (size_t i{ 1 }; i < SIZE; i++) {
        result = greater(pArr[i - 1],pArr[i]) ? pArr[i - 1] : pArr[i];
    }
    return result;
}

int foo() {
    int ints[] = {1, 2};
    return Max(ints);
}

const char* bar() {
    const char* stuff[] = {"1222", "234", "sfsdfsd"};
    return Max(stuff);
}


推荐阅读