c – 类型特征定义.特征blob和元功能

前端之家收集整理的这篇文章主要介绍了c – 类型特征定义.特征blob和元功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读一些源代码,我发现了下一个特征定义:
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.

猜你在找的C&C++相关文章