我一直在阅读
this similar question,发现自己对回应不满意.我没有一个简单的函数叫做“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)}
如果你想要这种能力,你自己的课程,here’s a link on how it works.