具有部分固定参数列表的 C++ 模板
c++ template with partially fixed argument list
考虑如下案例:
template<typename T>
class A { ... };
template<typename T, typename DataType = std::vector<A<T>>>
class B {
....
DataType data;
...
}
在我的例子中,DataType
类型可以是任何标准的“容器”,但它必须始终专门针对类型 A。A 的使用应该对外部 class B 透明,但是在 B 的定义中没有 DataType
的默认类型,应该明确指定例如B<int, std::deque<A<int>>
。我想消除这种可能性并实现类似的目标:
template<typename T, typename container = std::vector>
class B{
using DataType = container<A<T>>;
...
}
这样我就可以像 B<int, std::vector>
那样专攻 B。
当然它不能完全像这样,因为 container
在这种情况下应该是一个完整的类型,然后必须是特化的。有没有办法用 c++14 实现这个?
您可以使用 template template parameter 来完成,例如
template<typename T, template <typename...> typename container = std::vector>
class B {
using DataType = container<A<T>>;
...
};
然后像 B<int>
(即 B<int, std::vector>
)或 B<int, std::deque>
一样使用它。
考虑如下案例:
template<typename T>
class A { ... };
template<typename T, typename DataType = std::vector<A<T>>>
class B {
....
DataType data;
...
}
在我的例子中,DataType
类型可以是任何标准的“容器”,但它必须始终专门针对类型 A。A 的使用应该对外部 class B 透明,但是在 B 的定义中没有 DataType
的默认类型,应该明确指定例如B<int, std::deque<A<int>>
。我想消除这种可能性并实现类似的目标:
template<typename T, typename container = std::vector>
class B{
using DataType = container<A<T>>;
...
}
这样我就可以像 B<int, std::vector>
那样专攻 B。
当然它不能完全像这样,因为 container
在这种情况下应该是一个完整的类型,然后必须是特化的。有没有办法用 c++14 实现这个?
您可以使用 template template parameter 来完成,例如
template<typename T, template <typename...> typename container = std::vector>
class B {
using DataType = container<A<T>>;
...
};
然后像 B<int>
(即 B<int, std::vector>
)或 B<int, std::deque>
一样使用它。