【问题标题】:Type traits definition. Traits blobs & Metafunctions类型特征定义。特征 blob 和元函数
【发布时间】:2009-12-08 23:30:18
【问题描述】:

阅读一些源代码,我找到了下一个特征定义:

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; \
   }; \
}  

你们中的任何人都知道为什么第二种方法可能比第一种方法更脆弱,或者更难添加新特征吗?

【问题讨论】:

    标签: c++ templates typetraits


    【解决方案1】:

    拥有一个模板类现在称为“特征 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

    【讨论】:

    • @Samuel:特征块。这就是我要找的名字!谢谢。我已经订购了亚伯拉罕的书。
    【解决方案2】:

    这是风格问题。您的示例可能更易于维护,但具有单独的类型确实赋予它们独立的优势 - 您可以轻松地对所有指针类型进行专门化,例如,topic_data_reader,但让其他类型不专门化。

    如果你想更深入,我会质疑缺乏默认值:

    namespace dds {
      template <typename Topic> struct topic_traits {
        typedef typename Topic::type_support type_support;
        typedef typename Topic::data_writer data_writer;
        typedef typename Topic::data_reader data_reader;
        typedef typename Topic::seq_type seq_type;
      };
    }
    

    这种方法意味着任何提供必需的 typedef 的类都会自动符合条件。宏仍可用于生成这些 typedef 或专门化类,但这可能不是必需的(seq_type 看起来特别可疑,就像它通常是 typedef,而不是用户定义的类型)。

    编辑:对于较大的特征类,将事物分开可用于减少所需的实例化数量,但如果您的特征类具有使用一个可能意味着您正在使用其他元素的元素,这不会增加任何好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多