C++模板宏快捷方式

9
通常在使用模板时,你最终会得到这样的东西:
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)
   ...
};

这样做看起来更加简洁,而且当我创建其他模板类时避免了重复。这是一个好的做法吗?还是应该避免这样做,只需复制和粘贴typedefs?

1个回答

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

1
谢谢,我甚至没有想到那个。 - Corey
2
这也是为什么要从一元和二元函数继承functor的原因。我实际上有一个相关的问题,如何在the_class中使用那些typedef(假设它们是通过某种元编程voodoo获得的),但从http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18可以看出,没有*有意义的*方法... - UncleBens
1
我不同意这个解决方案,因为它存在“在依赖的基类中找不到名称”的问题。对于这些成员的每个引用都必须进行限定,如下所示:“typename template_defs<T>::”。例如,如果你想引用“const_reference”,你必须说“typename template_defs<T>::const_reference”,这并没有什么太大的改善。然而,将宏版本与模板混合使用的解决方案可能是可以接受的。 - Richard Corden
实际上,我的反对票不会被注册。我之前投了一票然后取消了,显然这仍然启动了“投票锁定计时器”,所以我无法重新投票。我必须承认,SO网站有一些功能真的让我很困惑,如果有人感兴趣,这是设计上的问题:http://meta.stackexchange.com/questions/18360/vote-too-old-to-be-changed-but-i-havent-voted - Richard Corden
我认为了解这两种技术都很好。个人而言,我不太明白为什么应该输入 'const_reference' 而不是只输入 'const T&'。那些 typedef 并非 the_class 实现所必需的,而是对用户有用,提供了一些简单的元编程功能。 - UncleBens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接