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

Using `std::vector` as default for template template parameter

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

template <template<typename val_t> class container_t>
struct foo;

为方便起见,foo默认容器为std::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;

我不喜欢,为了可读性(你必须搜索 vec_dummy)以及出于审美原因(没有理由命名该类型)。

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

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

template <typename container_t = std::vector<int>> struct foo;

不是一个选项。

您可以将 container_t 设为可变模板模板参数 (shiver)。

template <template<typename val_t, typename...> class container_t = std::vector>
struct foo;

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