2009-12-08 80 views
7

读一些源代码,我发现下一个特征定义:类型特征定义。性状斑点和元函数

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

任何你能弄清楚为什么第二种方法可能会比第一个或显著很难增加新的特征更加脆弱?

回答

5

拥有单个模板类现在称为“特征blob”。不推荐使用“特征blob”,因为它们不适用于元函数(即编译时函数)。

元函数是一个模板,它接受一个类并对其执行一些操作。喜欢的东西:

template <class T> 
class metafunction 
{ 
    typename T::type value = ...; 
} 

然后,您可以通过做要求你的任何特征的元功能:

metafunction<topic_type_support<int> >::value; 
metafunction<topic_data_writer<int> >::value; 

您将无法调用元函数的特征斑点类,因为那里现在是告诉元函数使用哪种typedef的方法。

如果你想了解更多关于元功能的知识,我推荐本书C++ Template Metaprogramming

+0

欲了解更多元编程谷歌助推MPL – KitsuneYMG 2009-12-09 04:31:51

+0

@Samuel:特质blob。那是我正在寻找的名字!谢谢。我已经订购了亚伯拉罕书。 – 2009-12-12 11:03:21

1

这是一个风格问题。你的例子可能更易于维护,但是具有不同的类型确实赋予它们独立的优点 - 你可以很容易地专门化所有指针类型,例如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类,自动合格。宏仍然可以用来生成这些类型定义或专门化类,但这可能不是必需的(特别是seq_type看起来像可疑的类似于它通常是typedef,而不是用户定义的类型)。

编辑:具有较大的特征类,分离出来的东西可以用来减少实例化所需的数量,但是如果你的特征类有元素使用一个可能意味着你使用其他元素,这没有增加任何好处。