【问题标题】:C++ template macro shortcutC++ 模板宏快捷方式
【发布时间】:2010-12-04 18:29:45
【问题描述】:

在使用模板时,您通常会得到以下结果:

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;

   ...
};

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

// 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;

所以我的课就变成了:

#include "template_types.h"

template <typename T>
class the_class
{
public:
   TEMPLATE_TYPES(T)
   ...
};

这看起来更简洁,并且在我制作其他模板类时避免了重复。这是一件好事吗?还是我应该避免这种情况而只是复制粘贴 typedef?

【问题讨论】:

    标签: c++ templates macros


    【解决方案1】:

    当然,你正在做的事情会奏效,但它有点老派。您是否尝试过将这些内容放入另一个可以派生的模板类中?

    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>
    ...
    

    【讨论】:

    • 谢谢,我没想到。
    • +1 这也是为什么要从一元和二元函数中继承仿函数的原因。我实际上有一个相关的问题,如何使用 the_class 中的那些typedef(假设它们是通过一些元编程巫术获得的)但是从parashift.com/c++-faq-lite/templates.html#faq-35.18看来没有有意义的方式...
    • -1 来自我。由于“在依赖基类中找不到名称”问题,我不同意此解决方案。对这些成员之一的每个引用都必须限定如下:“typename template_defs::”。例如,如果您想引用“const_reference”,则必须说“typename template_defs::const_reference”,这并没有好多少。但是,将宏版本与模板混合的解决方案可能没问题。
    • 实际上,我的downvote 不会被注册。我之前投票后撤消,显然这仍然会启动“投票锁定计时器”,所以我无法重新投票。我必须承认 SO 网站的某些功能确实让我感到困惑,如果有人对这个 /is/ 设计感兴趣:meta.stackexchange.com/questions/18360/…
    • 我想了解这两种技术会很好。就我个人而言,我不明白为什么我应该输入const_reference 而不仅仅是const T&amp;。这些 typedef 对 the_class 的实现并不重要,而是对用户有用,提供一些简单的元编程功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多