使用 `std::vector` 作为模板模板参数的默认值

Xle*_*lea 2 templates anonymous-types optional-parameters c++11

假设foo是一个采用容器类型的模板,它本身有一个模板参数来指定其值的类型:

template <template<typename val_t> class container_t>
struct foo;
Run Code Online (Sandbox Code Playgroud)

为方便起见,foostd::vector作为默认容器。问题是std::vector形式上有两个参数,其中第二个有默认值。这意味着... container = std::vector不起作用。

C++11 的解决方案是定义模板别名:

template<typename val_t> using vec_dummy = std::vector<val_t>;
template <template<typename val_t> class container_t = vec_dummy>
struct foo;
Run Code Online (Sandbox Code Playgroud)

我不喜欢,为了可读性(你必须搜索vec_dummy)和审美原因(没有理由命名那种类型)。

有没有办法以某种方式匿名定义模板别名?其他解决问题的方法当然也受到热烈欢迎。

PS:实际上,foo使用内部数据类型作为提供的容器的值类型,所以

template <typename container_t = std::vector<int>> struct foo;
Run Code Online (Sandbox Code Playgroud)

不是一个选择。

Tar*_*ama 5

您可以制作container_t一个可变参数模板模板参数(shiver)。

template <template<typename val_t, typename...> class container_t = std::vector>
struct foo;
Run Code Online (Sandbox Code Playgroud)

这样你就可以专注于值类型,但仍然维护任何分配器模板参数等。