8

私は以前にこのようなサンプルコードを見たことがあります

class C
{
    C();
    ~C();
    foo(T1, T2);
}

C::foo(T1, T2)
{
    //not using T1/T2
}

このような従来のコードとの比較

class D
{
    D();
    ~D();
    bar(T1 t1, T2 t2);
}

D::bar(T1 t1, T2 t2)
{
    //using t1 and t2
}

そして、使いやすさのために型変数を定義しない目的は何ですか?ほとんどの人は、APIのこれらのパラメーターが現在使用されていないことを示唆するためだけにこれを行いますが、将来的に下位互換性を確保するために行いますか?

それはおそらくRTTIのためですか、それとも静的変数を参照するためですか(私が見たさまざまなサンプルはこの目的のためにそれを使用していませんでしたが、それらはテンプレート化された関数でさえなく、変数は単に使用されていませんでした)。この機能を検索してみましたが、何と呼ばれているのか、何を検索すればよいのかさえわかりません。

基本的に、このアプローチを使用する理由/利点/欠点は何ですか?

4

3 に答える 3

6

@dag が言及したこととは別に、パラメーター名のない関数定義は、テンプレートの特殊化で使用されます。あなたが投稿した例にはテンプレートがないと言っていたことは知っていますが、完全を期すために、このユースケースを投稿したいと思います:

コンテナーのerase関数を定義したとします。stdただしerase_helper、コンテナーの種類に基づいて実際の作業を行うには、さまざまな方法が必要です。一般的で受け入れられる方法は、 を使用することtraitsです。

// Tags for containers
struct vector_tag {};
struct map_tag {};

// Trait class
template <typename C> struct container_traits;

// Specialization of trait class
template <typename T, typename A>
  struct container_traits<std::vector<T, A>>
  {
    typedef vector_tag category;
  };

template <typename K, typename V, typename C, typename A>
  struct container_traits<std::map<K, V, C, A>>
  {
    typedef map_tag category;
  };

// Helper function
template <typename Container, typename X>
  void erase_helper(Container& c, const X& x, vector_tag)  // <-- no param name
  {
    // Erase element from vector
  }

template <typename Container, typename X>
  void erase_helper(Container& c, const X& x, map_tag)  // <-- no param name
  {
    // Erase element from map
  }

// Function interface
template <typename Container, typename X>
  void erase(Container& c, const X& x)
  {
    erase_helper(c, x, typename container_traits<Container>::category());
  }

ここでわかるようにerase_helper、名前のない 3 番目のパラメーターがあります。パラメーターの型は、テンプレートのインスタンス化段階で正しい関数を選択するようにコンパイラに指示します。

于 2012-05-08T08:33:32.803 に答える
3

パラメータは実装の前に設計され、アーキテクチャによってより直接的に影響を受けるケースが増えています

次の理由により、パラメータが使用されていない可能性があります。

  1. 派生クラスで必要以上のパラメーターを持つ仮想関数をオーバーロードする
  2. パラメータは履歴上の理由から存在し、まだ API を変更したくない
  3. 将来の必要性を考慮する
于 2012-05-08T07:24:15.287 に答える