在以下场景中是否可以为模板的某些特化定义专用构造函数:
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) { ... }
答案 0 :(得分:7)
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) { ... }
};
希望这会有所帮助。
答案 1 :(得分:0)
考虑为主模板vector<T, D>
定义所有构造函数,然后在每个构造函数中定义static_assert
以确保arity匹配。例如:
vector(T t0, T t1)
{
static_assert(D == 2, "Eeeeeeeekkkkk! Wrong constructor!");
}