oma*_*tai 18 c++ optional-parameters
我一直在阅读这个类似的问题,发现自己对答案不太满意.我没有一个叫做"foo"的简单函数; 我有一个更复杂的功能,如果没有明智地提供参数,则会产生很大的危险.对于我来说,强制执行自己的规则并确保系统健壮性的功能似乎比倾向于坚持"一个功能,一个要做的事情"的语义细节更为可取.我认为对这个问题给出的有利回应反映了编程理想主义过于采取,而不是某些情况的现实.
我面临的是:
void DoSomethingVeryComplex( const CRect bounds, CPoint startPoint = CPoint(-1,-1) );
Run Code Online (Sandbox Code Playgroud)
现在这恰好满足了语义规则 - 它正在做一些事情,而不是几件事情.它做的一件事恰好是复杂的,多阶段的,但它仍然是一回事.
对于那个复杂的事情,建议用户提供边界,让函数确定自己的起点.高级用户可能希望进行相当大的数学计算以确定特定的替代起点并提供......但用户要注意.
而现在我已经看到,在极少数情况下,提供不是一个,而是几个起点是有道理的.这在所涉及的过程的语义概念中没有任何改变,因为该过程是从一个点传播到邻居,到邻居的邻居,等等.因此,从许多方面开始是一种自然的延伸.
因此,我更愿意指出:
void DoSomethingVeryComplex( const CRect bounds,
                             const std::vector<CPoint> startPoint /* = empty" */ );
Run Code Online (Sandbox Code Playgroud)
因此,如果向量为空,则函数像以前一样确定起点,如果向量中有任何点,则将它们用作起点.
是否有可用的C++语法允许我这样做 - 将空数组指定为默认参数?
chr*_*ris 34
在C++ 11中,它是最简单的:
const std::vector<CPoint> startPoint = {}
Run Code Online (Sandbox Code Playgroud)
在此之前,这将工作:
const std::vector<CPoint> startPoint = std::vector<CPoint>()
Run Code Online (Sandbox Code Playgroud)
这两个都调用默认构造函数,它创建一个空向量.请注意,只要您填写适当的参数,也可以使用相同的语法来调用其他构造函数.
//this one has 5 default-constructed CPoints
const std::vector<CPoint> startPoint = std::vector<CPoint>(5) 
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,您甚至可以填写默认向量:
const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)}
Run Code Online (Sandbox Code Playgroud)
如果你想为自己的课程提供这种能力,这里有一个关于它如何工作的链接.