组合模板类型的继承

时间:2015-07-28 09:44:04

标签: c++11 inheritance types

我想创建一个继承了两个模板化类型组合的类,例如:

#include <vector>
#include <set>

template<typename T, typename Base=std::vector<T>>
class A : public Base
{
};

int main()
{
    A<int> a;
    A<int, std::set<int>> b;

    return 0;
}

但是现在,我希望能够写出

    A<int, std::set> b;

而不是

    A<int, std::set<int>> b;

我该怎么办? 谢谢! :)

来自@Piotr S的

解决方案。

这里我重新发布了Piotr S.给出的完整解决方案。所以这个非常好的答案更容易找到其他人(不要忘记投票给他答案:-P):

#include <vector>
#include <set>
#include <utility>
#include <iostream>

template <template <typename...> class> struct tag {}; 

template <typename T, template <typename...> class Base = std::vector>
class A : public Base<T>
{
public:
    void add(const T& t)
    {
        return _add(tag<Base>{}, t);
    }

private:
    void _add(tag<std::set>, const T& t)
    {
        std::cout << "set\n";
        Base<T>::insert(t);
    }

    void _add(tag<std::vector>, const T& t)
    {
        std::cout << "vector\n";
        Base<T>::push_back(t);
    }
};

int main()
{
    A<int> a;
    A<int, std::set> b;

    a.add(1);
    b.add(1);
}

1 个答案:

答案 0 :(得分:2)

#include <vector>
#include <set>

template <typename T, template <typename...> class Base = std::vector>
class A : public Base<T>
{
};

int main()
{
    A<int> a;
    A<int, std::set> b;
}

DEMO