C++模板宏快捷方式

Cor*_*rey 9 c++ macros templates

通常在使用模板时,最终会得到以下内容:

template <T>
class the_class
{
public:
   // types
   typedef T value_type;
   typedef const value_type const_value_type;

   typedef value_type& reference;
   typedef const_value_type& const_reference;

   typedef value_type* pointer;
   typedef const_value_type* const_pointer;

   ...
};
Run Code Online (Sandbox Code Playgroud)

不过,这是很多相同的东西,复制到许多不同的模板类.是否值得创建类似的东西:

// template_types.h

#define TEMPLATE_TYPES(T) \
       typedef T value_type; \
       typedef const value_type const_value_type; \
       typedef value_type& reference; \
       typedef const_value_type& const_reference; \
       typedef value_type* pointer; \
       typedef const_value_type* const_pointer;
Run Code Online (Sandbox Code Playgroud)

所以我的班级变成了:

#include "template_types.h"

template <typename T>
class the_class
{
public:
   TEMPLATE_TYPES(T)
   ...
};
Run Code Online (Sandbox Code Playgroud)

这看起来更干净,并且在我制作其他模板类时避免重复.这是一件好事吗?或者我应该避免这种情况,只是复制粘贴typedef?

Mar*_*som 16

当然,你正在做的事情会起作用,但这是一种老派.您是否尝试将这些内容放入另一个可以派生的模板类中?

template <typename T>
class template_defs
{
public:
   // types
   typedef T value_type;
   typedef const value_type const_value_type;
   typedef value_type& reference;
   typedef const_value_type& const_reference;
   typedef value_type* pointer;
   typedef const_value_type* const_pointer;
};

template <typename T>
class the_class : public template_defs<T>
...
Run Code Online (Sandbox Code Playgroud)

  • +1这也是从一元函数和二元函数继承函子的原因.我实际上有一个相关的问题,如何在_class中使用**那些typedef(假设它们是通过一些元编程伏都教获得的),但是来自http://www.parashift.com/c++-faq-lite/templates.html #faq-35.18它似乎没有*有意义的*方式...... (2认同)