使用 `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;
这样您就可以专注于值类型,但仍然维护任何分配器模板参数等。
假设 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;
这样您就可以专注于值类型,但仍然维护任何分配器模板参数等。