阅读一些源代码,我发现了下一个特征定义:
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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。