C++模板添加/启用基于模板参数的构造函数

C++ template add/enable constructor based on template argument

本文关键字:于模板 参数 构造函数 启用 添加 C++      更新时间:2023-10-16

以下情况下,是否可以为模板的某些专用化定义专用构造函数:

template<typename T, size_t D>
class vector {
  T values[D];
public:
  vector();
};

我想添加的依赖于 D 参数的构造函数:

template<typename T>
vector<T, 2>::vector(T t1, T t2) { ... }
template<typename T>
vector<T, 3>::vector(T t1, T t2, T t3) { ... }
template<typename T>
vector<T, 4>::vector(T t1, T t2, T t3, T t4) { ... }
template<bool B>
using EnableIfB = typename std::enable_if<B, int>::type;
template<typename T, size_t D>
class vector {
  T values[D];
public:
  template<size_t D1 = D, EnableIfB<D1 == 2> = 0>
  vector(T t1, T t2) { ... }
  template<size_t D1 = D, EnableIfB<D1 == 3> = 0>
  vector(T t1, T t2, T t3) { ... }
  template<size_t D1 = D, EnableIfB<D1 == 4> = 0>
  vector(T t1, T t2, T t3, T t4) { ... }
};

希望这有帮助。

考虑为主模板定义所有构造函数 vector<T, D> ,然后在每个构造函数中static_assert以确保 arity 匹配。 例如:

vector(T t0, T t1)
{
    static_assert(D == 2, "Eeeeeeeekkkkk!  Wrong constructor!");
}