C++11 组合模板类型的继承

C++11 组合模板类型的继承,c++11,inheritance,types,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; }

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

#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 main()
{
A A;
A b;
返回0;
}
但是现在,我想能够写作

    A<int, std::set> b;
ab;
而不是

    A<int, std::set<int>> b;
ab;
请问我怎么做? 谢谢!:)

来自@Piotr S的解决方案。 在这里,我重新发布了Piotr S给出的完整解决方案。因此,这个非常好的答案更容易为其他人找到(别忘了投票支持他的答案:-p):

#包括
#包括
#包括
#包括
模板结构标记{};
模板
A类:公共基地
{
公众:
无效添加(常数T&T)
{
返回_add(tag{},t);
}
私人:
无效添加(标签、常数T&T)
{
std::cout
#包括
#包括
模板
A类:公共基地
{
};
int main()
{
A A;
A b;
}

显然,我对这一点的评论是不可能的,因为由于缺少模板参数,编译将失败,这一事实是完全错误的,我没有意识到:)这只适用于C++14吗?MSVC 2012拒绝编译这一点。非常有魅力!谢谢!@RudolfsBundulis它只使用C++11功能,MSVC 2012不是完全的C++11-compliant@PiotrS.谢谢:)我知道MSVC 2012不完全兼容,这就是为什么我问-想知道这是缺少的功能还是C++14。再次感谢,学到了一些新的东西:)你能简单地解释一下为什么编译器没有抱怨
std::set
缺少模板参数吗?@RudolfsBundulis这被称为模板参数是的,我遇到了这个错误,但我想知道是否有好的解决方案来解决这个问题……显然有:)我也不知道:)
#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);
}
#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;
}