4

最近、Boostにパラメータライブラリが見つかりました。正直なところ、これがBoostの一部である理由がわかりませんでした。関数にいくつかのパラメーターを渡す必要がある場合は、次のようにそれらから構造を作成できます。

struct Parameters
{
    Parameters() : strParam("DEFAULT"), intParam(0) {}
    string strParam;
    int intParam;
};

void foo(const Parameters & params)
{
}

Parameters params;
params.intParam = 42;
foo(params);

これは非常に書きやすく、理解しやすいものです。ブーストパラメータを使用した例:

BOOST_PARAMETER_NAME(param1) 
BOOST_PARAMETER_NAME(param2)

BOOST_PARAMETER_FUNCTION(
  (void),                // 1. parenthesized return type
  someCompexFunction,    // 2. name of the function template

  tag,                   // 3. namespace of tag types


  (optional              //    optional parameters, with defaults
    (param1,           *, 42)
    (param2,           *, std::string("default"))              )
  )
{
    std::cout << param1 << param2;
}

someCompexFunction(param1_=42);

本当に複雑で、メリットはそれほど重要ではないと思います。

しかし、Boostライブラリ(Asio)の一部がこの手法を使用していることがわかりました。このライブラリを使用して多くの引数を渡すことがベストプラクティスと見なされますか?

それとも、私には見えないこのライブラリを使用することの本当の利点がありますか?プロジェクトでこのライブラリを使用することをお勧めしますか?

4

2 に答える 2

2

あなたのテクニックでは、(十分なパラメータを指定して) 多くの一時変数を作成する必要があり、場合によってはかなり冗長になります。さらに難しいのはドキュメンテーションです。構成構造体のルートをたどると、パラメーターを説明する必要がある場所が 2 つあります。それに比べると、Boost.Parameter 関数の文書化は簡単です。

また、冗長性を抑え、新しい構成キャリアを何度も作成する代わりに、関数のファミリ全体の引数を再利用できるようにします。

ライブラリが気に入らない場合は、使用しないでください。あなたが言及していない他のいくつかの欠点があります(重いインクルード、長いコンパイル時間)。

また、2 つの世界のベストを提供しないのはなぜですか? Boost.Parameters を使用する 1 つの関数と構成構造体を使用する別の関数で、両方が共通の実装でディスパッチされます。ヘッダーを正しく管理すれば、「使わないものにはお金を払わない」という約束が守られます。価格は保守性です。ただし、ユーザーが気に入らない場合は、いつでも 1 つのインターフェイスを非推奨にすることができます。

于 2012-08-17T21:30:57.387 に答える
1

私はこのライブラリを使用していませんが、重要なのは、パラメータを名前で渡すことができるということです。

多くのパラメーターを持つ関数があり、ほとんどの場合、使用したいのは少数のみであると想像してください。常に同じ数であるとは限らないため、これらをリストの前に置いても (他のものをデフォルトとして提供できるように) 役に立ちません。そこで「名前付きパラメーター」の出番です。渡したいパラメーターの名前と値を任意の順序で指定するだけで、他のパラメーターはデフォルトになります。可能なすべてのパラメータを知る必要さえありません。新しいバージョンの関数では、何も壊さずに新しいパラメーターを追加できます (新しいパラメーターのデフォルトが古い動作を模倣するように選択されている場合)。

構造体と比較して、構造体を作成し、すべてをデフォルトで初期化できます。これは、私が間違っていなければ、パラメータオブジェクトを渡し、最後に実際の関数に渡す前にそこに値を設定することによって、この種のものが内部的にどのように機能するかです。

于 2012-08-17T21:25:03.897 に答える