5

type -> intコンパイル時に認識され、2 つのプログラム間で等しいマップが必要な 2 つの C++ プログラムがあります。さらに、マップが 1 対 1 であることをコンパイル時に自動的に確認したいと考えています。どのように解決しますか?(c++0x 拡張が許可されます)。最初の部分は簡単です:

template < typename T > struct map;
template <> struct map <...> { enum { val = ...; }; };

プログラム間。val(2 番目の部分は、プログラムのどこかで 2 つの異なる型に対して誤って同じものを定義したくないことを意味します。)

4

4 に答える 4

9

一意の ID を確保する 1 つの方法は、フレンド関数の定義を悪用することです。

template<int N>
struct marker_id {
  static int const value = N;
};

template<typename T>
struct marker_type { typedef T type; };

template<typename T, int N>
struct register_id : marker_id<N>, marker_type<T> {
private:
  friend marker_type<T> marked_id(marker_id<N>) {
    return marker_type<T>();
  }
};

template<typename T>
struct map;

template<>
struct map<int> : register_id<int, 0> { };

// The following results in the following GCC error
// x.cpp: In instantiation of 'register_id<float, 0>':
// x.cpp:26:43:   instantiated from here
// x.cpp:14:29: error: new declaration 'marker_type<float> marked_id(marker_id<0>)'
// x.cpp:14:29: error: ambiguates old declaration 'marker_type<int> marked_id(marker_id<0>)'
//
//// template<>
//// struct map<float> : register_id<float, 0> { };
于 2010-09-18T13:10:12.173 に答える
3

boost::mpl::mapを使用するのはどうですか?次のようなものを共有します。

// Include your headers

using namespace boost::mpl;
typedef map<
      pair<1,MyFirstClass>
    , pair<2,MySecondClass>
    , pair<3,MyThirdClass>
    > m;
于 2010-09-18T13:05:54.083 に答える
2

コンパイル時に厳密に実行するわけではありませんが、この関数のペアは、渡されたタイプごとに一意のIDを自動的に生成します。

template<class T>
int generate_type_id() {

    static int value = 0;
    return value++;

}

template<class T>
int type_id() {

    static int value = generate_type_id<T>();
    return value;

}

また、両方のプロジェクトで関数を順番に明示的に呼び出すことにより、2つのアプリケーションが特定のタイプに対して同じ識別子を共有することを保証できるはずです。

type_id<int>();
type_id<Foo>();
type_id< map<string, pair<int, Bar> >();

はい、これにより、関連するすべてのタイプのリストを作成する必要がありますが、ヘッダーに#include入れたり、それらの間に入れたりして、少なくともコードの重複を避けることができます。これにより、Johannes Schaubの回答のように、タイプごとに一意のIDを自分で作成する必要もなくなりますが、コンパイル時に完全に実行されるため、コンパイラによって静的にチェックされるという利点があります。私は代替案を提供しているだけです。

于 2010-09-18T13:29:34.780 に答える
0

簡単な方法は、両方のプログラムで同じクラスを共有することです。

再利用は、OOP の目的の 1 つです。

マップとその初期化をカプセル化するクラスを作成して、両方の C++ プログラムで使用できます。

于 2010-09-18T15:03:50.373 に答える