阅读一些源代码,我发现了下一个特征定义:
namespace dds { template <typename Topic> struct topic_type_support { }; template <typename Topic> struct topic_data_writer { }; template <typename Topic> struct topic_data_reader { }; template <typename Topic> struct topic_data_seq { }; } #define REGISTER_TOPIC_TRAITS(TOPIC) \ namespace dds { \ template<> struct topic_type_support<TOPIC> { \ typedef TOPIC##TypeSupport type; }; \ template<> struct topic_data_writer<TOPIC> { \ typedef TOPIC##DataWriter type; }; \ template<> struct topic_data_reader<TOPIC> { \ typedef TOPIC##DataReader type; }; \ template<> struct topic_data_seq<TOPIC> { \ typedef TOPIC##Seq type; }; \ }
这对我来说很奇怪.我会将所有特征分组在一个独特的类中,如下所示:
namespace dds { template <typename Topic> struct topic_traits { }; } #define REGISTER_TOPIC_TRAITS(TOPIC) \ namespace dds { \ template<> struct topic_traits<TOPIC> { \ typedef TOPIC##TypeSupport type_support; \ typedef TOPIC##DataWriter data_writter; \ typedef TOPIC##DataReader data_reader; \ typedef TOPIC##Seq seq_type; \ }; \ }
解决方法
拥有单个模板类现在称为“traits blob”.不建议使用“Traits blob”,因为它们与元函数(即编译时函数)不兼容.
元函数是一个模板,它接受一个类并对其执行一些操作.就像是:
template <class T> class Metafunction { typename T::type value = ...; }
Metafunction<topic_type_support<int> >::value; Metafunction<topic_data_writer<int> >::value;
您将无法使用特征blob类调用元函数,因为现在可以告诉元函数使用哪个typedef.
如果您想了解有关元函数的更多信息,我建议您阅读本书C++ Template Metaprogramming.