如何在编译时注册类型的键值对?

时间:2014-04-09 10:58:44

标签: c++

我们说我有一个类Test和一个TestImpl类。我不想让Impl成为Test的内部类。如何在编译时创建一些全局键值(Type-Impl)存储库,其中可以使用Type拉出Impl的类型?

类似的东西:

Impl<Test>::Type

这应该导致TestImpl。

2 个答案:

答案 0 :(得分:2)

定义没有实现的通用模板,然后专门化它:

template <typename T> struct Impl;
template<> struct Impl<Test> { typedef TestImpl Type; };

等等,对于您需要的每种类型。

答案 1 :(得分:1)

组织接口和实现的一种便捷方法是使用与之关联的标记:

template<typename TAG> class interface;
template<typename TAG> class impl;

template<typename> struct impl_of;

template<typename TAG>
struct impl_of<interface<TAG> > { using type = impl<TAG>; };

然后定义下面的内容:

namespace tag {
   struct Test;
   struct Foo;
   struct Bar;
   // etc.
}

using Test = interface<tag::Test>;
using Foo = interface<tag::Foo>;
using Bar = interface<tag::Bar>;
// etc.

现在您的实际课程定义不是TestTestImpl等,而是专业化:

template<>
class interface<tag::Test> {
    // Test class definition
};

template<>
class impl<tag::Test> {
    // TestImpl class definition
};

在这种情况下,所需的映射由impl_of提供,interface仅定义一次。

这可能听起来太多了,但如果要在其上定义许多类(如implimpl_of)和许多特征(如{{1}}),则功能非常强大。