fni*_*eto 7 c++ templates type-traits
阅读一些源代码,我发现了下一个特征定义:
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; }; \
}
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪.我会将所有特征分组在一个独特的类中,如下所示:
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; \
}; \
}
Run Code Online (Sandbox Code Playgroud)
您是否可以找出为什么第二种方法比第一种方法更脆弱或者更难以添加新特性?
拥有单个模板类现在称为"traits blob".不建议使用"Traits blob",因为它们与元函数(即编译时函数)不兼容.
元函数是一个模板,它接受一个类并对其执行一些操作.就像是:
template <class T>
class metafunction
{
typename T::type value = ...;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过执行以下操作为您的任何特征调用元函数:
metafunction<topic_type_support<int> >::value;
metafunction<topic_data_writer<int> >::value;
Run Code Online (Sandbox Code Playgroud)
您将无法使用特征blob类调用元函数,因为现在可以告诉元函数使用哪个typedef.
如果您想了解有关元函数的更多信息,我建议您阅读C++ Template Metaprogramming一书.