16

プログラムの安全性を向上させるために、Booststrongtypedefユーティリティをよく使用します。たとえば、次のようなコードを記述します。

BOOST_STRONG_TYPEDEF(int, X)
BOOST_STRONG_TYPEDEF(int, Y)
BOOST_STRONG_TYPEDEF(int, Width)
BOOST_STRONG_TYPEDEF(int, Height)

struct Rect {
    Rect(X x, Y y, Width w, Height h);
};

// Usage:
Rect rect(X(10), Y(20), Width(800), Height(600));

ここでの強力なtypedefは、コードの可読性と安全性の両方を向上させます。(引数が間違った順序で提供された場合、コンパイラーはエラーを報告します。これは、引数がすべての場合には当てはまりませんでしたint。)

私の質問は次のとおりです。

  • この目的でBOOST_STRONG_TYPEDEFを使用しても大丈夫ですか?(ドキュメントは非常に簡潔です。)
  • 代わりにブーストパラメータライブラリを好む重要な理由はありますか?
4

2 に答える 2

20

技術的に言えば:

  • できます
  • 型安全性を追加します

実際には:

単一の関数のパラメーターのためだけに新しい型を作成することはお勧めしません(この関数に固有の列挙型でない限り)。キャストが繰り返し使用されないように、型はアプリケーションに浸透する必要があります。

タイプ、、、およびがアプリケーション全体で使用されている場合X、キャストYがないだけでなく、アプリケーションははるかに安全で、はるかに適切に文書化されます(ええ...私はタイプフリークです)。WidthHeight

さて、Boost.Parametersに関しては、これは完全に異なります。

Boost.Parametersは、タイプがすでに配置されている場合に(潜在的に)追加できます。正直なところ、私はその必要性を見たことがありませんでした。関数が扱いにくくなり、Boost.Parametersを呼び出す必要がある場合は、関数を修正する必要があります。混乱を増やすのではありません。

于 2012-02-09T13:39:56.553 に答える
2

BOOST_STRONG_TYPDEFを使用すると、新しいタイプが作成されますが、ブーストパラメーターライブラリはパラメーターに名前を付けるためのものです。これにより、関数が取るものをより明確にすることができます。たとえば(ブーストドキュメントから)

#include <boost/parameter/preprocessor.hpp>

namespace graphs
{
  BOOST_PARAMETER_FUNCTION(
      (void),                // 1. parenthesized return type
      depth_first_search,    // 2. name of the function template

      tag,                   // 3. namespace of tag types

      (required (graph, *) ) // 4. one required parameter, and

      (optional              //    four optional parameters, with defaults
        (visitor,           *, boost::dfs_visitor<>())
        (root_vertex,       *, *vertices(graph).first)
        (index_map,         *, get(boost::vertex_index,graph))
        (in_out(color_map), *,
          default_color_map(num_vertices(graph), index_map) )
      )
  )
  {
      // ... body of function goes here...
      // use graph, visitor, index_map, and color_map
  }
}

ほぼ契約による設計で、期待されることを明確に言うことができます。ただし、これによりコードの可読性が複雑になり、実行する価値がなくなることがわかりました。

個人的には、BOOST_STRONG_TYPEDEFを使用することを好みます。これは、「関数またはテンプレートパラメーターのいずれかを照合するために使用できる」新しいタイプを作成するためです(これもブーストドキュメントから)。

于 2012-02-09T13:09:56.577 に答える