20

私はこの同様の質問を読んでいて、回答に満足していないことに気づきました。「foo」という単純な関数はありません。パラメータが適切に提供されていない場合、非常に現実的な危険を伴う、はるかに複雑な関数があります。関数が「1つの関数、1つのこと」を主張するセマンティックな優れた機能に傾倒するよりも、関数が独自のルールを適用し、システムの堅牢性を確保する方が好ましいように思われます。その質問に対する好意的な回答は、特定の状況の現実ではなく、プログラミングの理想主義が行き過ぎていることを反映していると思います。

私が直面しているのは:

void DoSomethingVeryComplex( const CRect bounds, CPoint startPoint = CPoint(-1,-1) );

今、これはセマンティックルールを満たしています-それはいくつかのことではなく、いくつかのことをしています。それがしていることの1つは、たまたま複雑で多段階ですが、それでも1つのことです。

その複雑なことについては、ユーザーが境界を指定し、関数に独自の開始点を決定させることをお勧めします。上級ユーザーは、特定の代替開始点を決定し、それを提供するためにかなりの計算を行うことを望むかもしれません...しかし、ユーザーは注意してください。

そして今、私はまれに、1つではなく、いくつかの出発点を提供することが理にかなっていることに気づきました。これは、関連するプロセスのセマンティックコンセプトに何の変化もありません。これは、プロセスが1つのポイントから隣接するポイント、隣接するプロセスなどに広がるプロセスであるためです。したがって、多くのポイントから開始することは自然な拡張です。

したがって、私は以下を指定したいと思います。

void DoSomethingVeryComplex( const CRect bounds,
                             const std::vector<CPoint> startPoint /* = empty" */ );

そのため、ベクトルが空の場合、関数は以前と同じように開始点を決定し、ベクトルに点がある場合は、それらが開始点として使用されます。

これを可能にするC++構文はありますか?デフォルトのパラメーターとして空の配列を指定できますか?

4

1 に答える 1

38

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)}

独自のクラスにそのような機能が必要な場合は、その仕組みに関するリンクを参照してください

于 2012-05-15T22:49:18.993 に答える