从std :: set或std :: map继承初始化语法

时间:2014-05-02 21:56:27

标签: c++ stl

标准库忽略了实现std::setstd::map的基本操作,如

set<T> set<T>::getUnion(set<T> other)

bool map<K,V>::contains(K key)

我知道这些方法有冗长和/或间接的解决方法,但如果我希望我的代码具有最大的可读性和表现力,我将不得不继承STL,编写我自己的{{1} }和Set类,并自己实现它们。是的,我知道反对这样做的讲道,但事实是STL不完整。

我已经这样做但现在我无法使用例如

来初始化我的新课程
Map

如何从Set<int> s = {1,2,3,4}; 类继承这些初始值设定项?

2 个答案:

答案 0 :(得分:3)

尽管公开继承标准库容器被认为是一个坏主意,但您可以“继承”构造函数:

template <typename T>
struct Set : std::set<T>
{
  using std::set<T>::set; // "inherit" the constructors.
};

然后

Set<int> s{1,6,4,3,3,9};

请注意,更好的方法可能是实现功能:

template <typename C>
bool contains(const C& container, const typename C::key_type& key)
{
  return container.count(key);
}

similarly for the union of sets

答案 1 :(得分:1)

对于gcc 4.7.x,您必须致电initializer_listset的{​​{1}}构造函数:

map

允许

template <typename T>
class Set : public set<T> {
public:
    Set(){
        set<T>::set();
    }
    Set(initializer_list<T> iList) {
        set<T>::set(iList);
    }
};

但经过多次反复试验后,我无法找到Set<int> s = {1,2,3,4}; 的方法。

此外,它会禁用所有其他构造函数,要求我重新实现它们,这是我尚未完成的任务,因此我现在只是放弃初始化程序列表。欢迎任何人提交一个答案,将所有构造函数重新实现为std::map,我将选择它作为答案。