是否可以指定一个空的 std::vector 作为默认参数
Is it possible to specify an empty std::vector as a default parameter?
我一直在阅读这个类似的问题,发现自己对回答不太满意。我没有一个名为"foo"的简单函数;我有一个更复杂的函数,如果不明智地提供参数,它就会有非常现实的危险。在我看来,函数执行自己的规则并确保系统健壮性似乎比倾向于坚持"一个函数,一件事要做"的语义细节更可取。我认为,对这个问题的有利回答反映了过于偏袒的编程理想主义,而不是某些情况的现实。
我面对的是:
void DoSomethingVeryComplex( const CRect bounds, CPoint startPoint = CPoint(-1,-1) );
现在这恰好满足语义规则 - 它正在做一些事情,而不是几件事。它正在做的一件事恰好是复杂的,多阶段的,但它仍然是一件事。
对于这种复杂的事情,建议用户提供边界,并让函数确定自己的起点。高级用户可能希望进行相当多的数学运算来确定特定的替代起点并提供...但用户要当心。
现在我开始看到,在极少数情况下,提供不是一个起点,而是提供几个起点是有意义的。这不会改变所涉过程的语义概念,因为该过程是一个从一个点传播到邻居,传播到邻居的邻居,等等。所以从多点出发是自然的延伸。
因此,我更愿意指定:
void DoSomethingVeryComplex( const CRect bounds,
const std::vector<CPoint> startPoint /* = empty" */ );
因此,如果向量为空,函数将像以前一样确定起点,如果向量中有任何点,则将它们用作起点。
是否有可用的C++语法允许我执行此操作 - 将空数组指定为默认参数?
在 C++11 中,最简单的是:
const std::vector<CPoint> startPoint = {}
在此之前,这将起作用:
const std::vector<CPoint> startPoint = std::vector<CPoint>()
这两个都调用默认构造函数,这将创建一个空向量。请注意,只要填写适当的参数,也可以使用相同的语法来调用其他构造函数。
//this one has 5 default-constructed CPoints
const std::vector<CPoint> startPoint = std::vector<CPoint>(5)
在 C++11 中,您甚至可以填写默认向量:
const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)}
如果您希望自己的类具有这种功能,这里有一个关于它如何工作的链接。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?