随笔-90  评论-947  文章-0  trackbacks-0

如题,想进行带模板参数的 typedef,如:

template <typename T>

typedef RBTree<T> Set<T>;

template <typename T>

typedef Set<List<T>> MultiSet<T>;

template <typename K, typename V>

typedef Set<Pair<K, V>> Map<K, V>;

template <typename K, typename V>

typedef Map<K, List<V>> MultiMap<K, V>;

却无这种语法。

 

目前能想到的就是

template <typename T>

class Set : public RBTree<T>

{

};

template <typename T>

class MultiSet : public Set<List<T>>

{

};

template <typename K, typename V>

class Map : public Set<Pair<K, V>>

{

};

template <typename K, typename V>

class MultiMap : public Map<K, List<V>>

{

};

 

不知有没有更好的方法?

posted on 2009-11-07 20:26 溪流 阅读(566) 评论(3)  编辑 收藏 引用 所属分类: C++

评论:
# re: 有没有&ldquo;template typedef&rdquo;的比较好的等价实现? 2009-11-07 23:13 | OwnWaterloo
C++0x可以...
好像叫template alias

  回复  更多评论
  
# re: 有没有&ldquo;template typedef&rdquo;的比较好的等价实现? 2009-11-08 00:35 | 溪流
@OwnWaterloo

那么说基本上不可以咯?  回复  更多评论
  
# re: 有没有&ldquo;template typedef&rdquo;的比较好的等价实现? 2009-11-08 00:53 | OwnWaterloo
@溪流
好像是这样的…… 很尴尬……

RbTree和Set还好一些,因为它们的接口不一定相同,可能真的需要用RbTree实现Set,并增加或隐藏一些成员。

我以前遇到的情况是实现了一个allocator,然后想运用到STL的容器当中去,发现了这个问题……

下面这种想当然的代码行不通:
template<typename T>
typedef std::vector<T,my_allocator<T> > my_vector;

而且my_vector和vector行为完全相同。不像RbTree,本来就需要Set去adapt一下。比如下面3种代码,都很恶心:

1.
template<typename T>
my_vector : public std::vector<T,my_allocator<T> > {};

2.
template<typename T>
my_vector : std::vector<T,my_allocator<T> > {
// forwarding functions
};

3.
template<typename T>
my_vector {
std::vector<T,my_allocator<T> > v_;
// forwarding functions
};


后来想想,算了,我的工作就是提供allocator,不负责为其取一个好听的名字。
敢用allocator的人,肯定知道应该这么用:
std::vector<his_element,my_allocator<T> > v; //一个使用了my_allocator的std::vector。
同样工作得很好嘛。



相反,使用c++0x的功能,可能还会造成一些问题:
my_vector<int> v; // my_vector是什么东西?

哦,看到这些代码,才能明白它是什么东西:
template<typename T>
using my_vector = std::vector<T,my_allocator<T>>;


这和typedef的误用会过多引入不必要的概念是一个道理。

  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理