模板专用之间的构造函数重载 类
constructor overloading between template specialized classes
在下面的代码中,我有一个 class 模板及其专业化。
template<size_t U>
struct Foo
{
Foo(double(&u)[U]) : u{ u } {}
double(&u)[U];
};
template<>
struct Foo<1>
{
double &u;
bool specialized = true;
Foo(double &u) : u{ u } {}
};
如果我尝试使用推导的模板参数创建实例,则构造函数参数将仅与通用 Foo
对象匹配。
double s[7] = { 1, 2, 3, 4, 5, 6, 7 };
Foo f(s); // will deduce s is of type Foo<7>
double t = 5.;
Foo g(t); // no instance matches the argument list!
Foo<1> g(t); // I must explicitly tell it I'm using the specialization
当然,如果专用 class 具有 相同的构造函数参数 ,我做了类似 Foo g(t)
的操作,其中 t
是类型double[1]
,该实例将是专用类型。
那么,在这种情况下,为什么专用构造函数也没有解析(或者构造函数集的一部分)?
Implicitly-generated推演指南只考虑初级模板,但您可以自己添加推演指南:
Foo(double &u) -> Foo<1>;
另请注意
double t[1] = {5.};
Foo g(t); // deduce Foo<1>, but fails as specialization doesn't have compatible constructor
在下面的代码中,我有一个 class 模板及其专业化。
template<size_t U>
struct Foo
{
Foo(double(&u)[U]) : u{ u } {}
double(&u)[U];
};
template<>
struct Foo<1>
{
double &u;
bool specialized = true;
Foo(double &u) : u{ u } {}
};
如果我尝试使用推导的模板参数创建实例,则构造函数参数将仅与通用 Foo
对象匹配。
double s[7] = { 1, 2, 3, 4, 5, 6, 7 };
Foo f(s); // will deduce s is of type Foo<7>
double t = 5.;
Foo g(t); // no instance matches the argument list!
Foo<1> g(t); // I must explicitly tell it I'm using the specialization
当然,如果专用 class 具有 相同的构造函数参数 ,我做了类似 Foo g(t)
的操作,其中 t
是类型double[1]
,该实例将是专用类型。
那么,在这种情况下,为什么专用构造函数也没有解析(或者构造函数集的一部分)?
Implicitly-generated推演指南只考虑初级模板,但您可以自己添加推演指南:
Foo(double &u) -> Foo<1>;
另请注意
double t[1] = {5.};
Foo g(t); // deduce Foo<1>, but fails as specialization doesn't have compatible constructor