重载指向集合的指针的开始/结束是否是个好主意
Is it a good idea to overload begin/end for pointers to collections
我真的很喜欢自由begin
end
的新概念来编写更通用的算法和数据结构。目前,我有时会遇到这样的情况,当类型将对集合的引用作为指针时,我必须区分调用begin(range)
和begin(*range)
。我想过总是为我自己的集合类型的指针提供开始/结束的重载是否是一个好主意。
struct Container {
int values[3];
};
const int* begin(const Container& c);
const int* end(const Container& c);
const int* begin(const Container* c);
const int* end(const Container* c);
template<typename Range>
int Sum(const Range& range)
{
return std::accumulate(begin(range), end(range), 0);
}
int main(void)
{
Container c = {1, 2, 3};
std::cout << Sum(c);
std::cout << Sum(&c);
}
如果这是一个好主意,为什么不为此提供一个模板:
template<typename Range>
auto begin(const Range* r) -> decltype(begin(*r)){
using std::begin;
return begin(*r);
}
template<typename Range>
auto end(const Range* r) -> decltype(end(*r)) { /* ... */ }
int main(void)
{
Container c = {1, 2, 3};
std::vector<int> v = {1, 2, 3}
std::cout << Sum(c);
std::cout << Sum(&c);
std::cout << Sum(v);
std::cout << Sum(&v);
}
如果这是一个好主意,为什么标准库不定义它?
我的问题是:template<typename R>
auto begin(const R* r)
模板有什么问题吗?是否有任何情况会因某种原因而失败?
如果这样做,您将不能再对数组使用 std::begin()
和重载std::end()
:
Container c[2] = { };
std::accumulate(begin(c), end(c), 0);
这不应该编译,因为您无法将c[i]
添加到0
,但它确实如此,因为选择了begin(Container*)
重载而不是泛型重载std::begin(T (&)[N])
重载。
再举一个例子:
Container c[2] = { };
auto dist = std::distance(begin(c), end(c));
这应该设置为 dist=2
,因为数组有两个元素,但你会得到dist=3
end(*c) - begin(*c)
因为 等于 3。
相关文章:
- C++LDAP检查用户是否是特定组的成员
- 检查某些类型是否是模板类 std::optional 的实例化
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 如何检查模板专用化是否是基本模板的子类?
- 如何检查变量是否是C++中的地图?
- C++ Chrono 确定一天是否是周末?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- C ++:检查它是否是类中的数字
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 有没有办法检查发送到变量的值是否是正确的类型,而它已经在该变量下?
- 如何检查一个模板是否是另一个模板的类成员
- 有没有办法检查用户输入是否是数字?
- 重载指向集合的指针的开始/结束是否是个好主意