模棱两可的功能超载[例如最大限度()]
Ambiguous Function Overloads [e.g. max()]
是否可以在C 中超载具有相似但不同模板签名的函数。
考虑max((函数。如果我想要max()
函数,该功能可以采用以下三个选项:int
,*int
范围,int
迭代器范围。
STL具有此功能分为两个函数:
- max((
- max_element((
那么,您或您不能在C 中实现此行为,如果是这样,如何?
编辑:这将使max(vec.begin(), vec.end());
和max(vec[0], vec[1]);
成功编译,并找到两个传递对象的范围和最大值的最大值。我个人认为不可能将两个功能合并在STL中,但我会确认这不是可行的。
现在过载是模棱两可的,因为您没有限制它们。编译器应该如何知道不应该将第一个用于迭代器?
答案很简单,您必须告诉它。幸运的是,该标准定义了std::iterator_traits
,您可以查询有关您传递给它的迭代器类型的各种信息 - 只要它是迭代器。
此处的最后一点是密钥:如果std::iterator_tags<T>
没有嵌套的Typedef iterator_category
,则T
不是迭代器。因此,我们可以使用void_t
使用成员检测来定义一个自定义特征,该特征检查给定类型是否为迭代器。
在代码中,看起来像这样:
// C++17 void_t
template <typename...>
using void_t = void;
template <typename T, typename = void>
struct is_iterator : std::false_type {
};
template <typename T>
struct is_iterator<T, void_t<typename std::iterator_traits<T>::iterator_category>> : std::true_type {
};
template <typename T>
constexpr auto is_iterator_v = is_iterator<T>::value;
在这里,我还定义了Constexpr变量is_iterator_v
,以便于方便。
我们可以将此特征与std::enable_if
结合使用,以根据T
类型是迭代器,选择性地禁用两个先前模棱两可的过载之一。为此,只需分别由template <typename T, std::enable_if_t<is_iterator_v<T>, int> = 0>
和template <typename T, std::enable_if<!is_iterator_v<T>, int> = 0>
替换模板声明template <typename T>
即可。
将所有内容整合在一起,代码看起来应该与此相似:
// C++17 void_t
template <typename...>
using void_t = void;
template <typename T, typename = void>
struct is_iterator : std::false_type {
};
template <typename T>
struct is_iterator<T, void_t<typename std::iterator_traits<T>::iterator_category>> : std::true_type {
};
template <typename T>
constexpr auto is_iterator_v = is_iterator<T>::value;
template<typename T, std::enable_if_t<!is_iterator_v<T>, int> = 0>
constexpr T maximum(T a, T b)
{
return (a > b) ? a : b;
}
template<typename Iter, std::enable_if_t<is_iterator_v<Iter>, int> = 0>
constexpr Iter maximum(Iter begin, Iter end)
{
if(begin == end) {
return end;
}
auto max = begin;
for (; begin != end; ++begin) {
if(*begin > *max) {
max = begin;
}
}
return max;
}
您还可以在wandbox上找到工作示例。
- 我有模板功能.通过使用函数std::for_each,用这个容器中的最大数字替换每个正数
- 使用一个功能打印最大值和平均值
- 操作顺序以最大限度地提高精度
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- 模棱两可的功能超载[例如最大限度()]
- 如何最大限度地减少使用标量 SIMD 内部函数的 SIMD 注册表的双重负载开销
- 如何通过只加载用户需要的内容来最大限度地提高字符串的效率
- 通过ARM NEON程序集最大限度地优化元素乘法
- CUDA:最大限度地减少大型数据类型的银行冲突
- 工具来帮助最大限度地减少C++程序中宏的使用
- 如何最大限度地使用数字0来优化程序
- 如何最大限度地减少来自 arduino 的串行通信读取错误
- 如何在最大限度地提高大小有效性的同时,将3态的位运算符实现为任何大小的内存
- Windows c++如何最大限度地启动应用程序
- BerkeleyDB最大限度地提高性能和减少数据丢失
- 在std容器上执行一系列操作时,最大限度地减少峰值内存使用
- 最大限度地理解子阵列_问题
- 如何优化VBO/IBO以最大限度地利用GPU缓存
- 使用 Boost 的 file_mapping 和mapped_region最大限度地减少内存使用?
- 最大限度地提高孩子的幸福感