我们说我有一个类Test和一个TestImpl类。我不想让Impl成为Test的内部类。如何在编译时创建一些全局键值(Type-Impl)存储库,其中可以使用Type拉出Impl的类型?
类似的东西:
Impl<Test>::Type
这应该导致TestImpl。
答案 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.
现在您的实际课程定义不是Test
,TestImpl
等,而是专业化:
template<>
class interface<tag::Test> {
// Test class definition
};
template<>
class impl<tag::Test> {
// TestImpl class definition
};
在这种情况下,所需的映射由impl_of
提供,interface
仅定义一次。
这可能听起来太多了,但如果要在其上定义许多类(如impl
,impl_of
)和许多特征(如{{1}}),则功能非常强大。