c++ - 以数组为参数的模板特化
问题描述
我正在尝试专门化此功能模板:
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”:非法使用显式模板参数。有人可以帮我吗?我想了解它为什么不起作用以及如何使它起作用。
谢谢!
解决方案
您不能对函数进行部分特化。但是您不必这样做,因为函数已经支持重载。您只需要为const char*
. 您的版本有两个错误。
- 您已将结果变量声明为,
char
但它应该是const char*
. - 使用 , 比较随机指针
>
并没有给出有意义的结果。你必须决定如何称呼一个比另一个大。
链接: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);
}
- 还有一个问题:
Max
假设数组至少有两个元素。您可以static_assert
正确添加或处理案例。 - 仅供参考,有一个标准库算法
std::max_element
也可以与数组一起使用。https://en.cppreference.com/w/cpp/algorithm/max_element
推荐阅读
- javascript - Javascript 如何在 :active 伪元素上使用 getComputedStyle?
- bash - 使用 cat 命令时如何避免覆盖
- java - 是否可以在实现接口的类中重载方法?
- excel - 将工作日和日历天数组合为计算器
- cmd - 为什么 FINDSTR 在使用 FOR 循环在多个文件夹上执行时匹配并且不输出任何内容?
- google-apps-script - gmail 新电子邮件内容并自动传输到谷歌电子表格
- google-data-studio - 数据工作室错误 - 预定义的日期范围无法在查看模式下更改
- python - 在python中将运算符传递给属性的优雅方法
- python - Python正则表达式在斜杠之前或之后匹配字符
- python - 使用 numpy 从一个 2d 数组中以任意顺序在另一个 2d 数组中查找公共行