我想创建一个继承了两个模板化类型组合的类,例如:
#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);
}
答案 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;
}