5

我有两个 c++ 程序需要有一个type -> int在编译时已知并且在两个程序之间相等的映射。此外,我想在编译时自动确保地图是一对一的。你会怎么解决?(允许使用 c++0x 扩展)。第一部分很简单:分享一个

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

程序之间。(第二部分意味着我不想val在我的程序中的某个地方意外地为两种不同的类型定义相同的内容。)

4

4 回答 4

9

确保 uniqe id 的一种方法是滥用友元函数定义

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;

}

您应该能够通过在两个项目中按顺序显式调用函数来确保两个应用程序对于给定类型共享相同的标识符:

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

是的,这迫使您编写所有涉及类型的列表,但您可以将其放入标题中,放在#include它们之间,至少避免代码重复。这也免除了您必须自己为每种类型提供唯一 ID 的责任,正如 Johannes Schaub 的回答所做的那样,尽管他的优点是完全在编译时完成,因此由编译器进行静态检查。我只提供一个替代方案。

于 2010-09-18T13:29:34.780 回答
0

一种简单的方法可能是在两个程序中共享同一个类。

重用是 OOP 的目标之一。

可以创建封装映射及其初始化的类,然后在两个 C++ 程序中使用。

于 2010-09-18T15:03:50.373 回答