我正在实现一些我想“嵌套”数字类型的东西。我正在努力以右侧可以是数字文字的方式编写构造函数。这是我的问题的缩小版本:
template <typename Scalar>
class A
{
public:
A(Scalar a):v(a){};
Scalar v;
};
template <typename Scalar>
class B
{
public:
B(Scalar a):v(a){};
Scalar v;
};
int main()
{
A<double> a = 1.0;
B<double> b = 1.0;
B<A<double>> ba = 1.0;
}
编译错误是
error: no viable conversion from 'double' to 'B<A<double>>'
我不想写B<A<double>> b = A<double>(1.0);
.有没有办法改变我的 A
和 B
类,以便原始代码有效?
最佳答案
你想要的是转发构造函数。这是一个构造函数,它采用参数来构造包装对象,并使用提供的参数调用该对象的构造函数。看起来像
template <typename Scalar>
class A
{
public:
A(Scalar a):v(a){};
Scalar v;
};
template <typename Scalar>
class B
{
public:
B(Scalar a): v(a) {}
template <typename... Args,
std::enable_if_t<std::is_constructible_v<Scalar, Args...>, bool> = true>
B(Args&&... args) : v(std::forward<Args>(args)...) {}
Scalar v;
};
int main()
{
A<double> a = 1.0;
B<double> b = 1.0;
B<A<double>> ba = 1.0;
}
std::enable_if_t<std::is_constructible_v<Scalar, Args...>, bool> = true
模板的一部分利用了 SFINAE限制此构造函数仅在能够构造 Scalar
时才起作用.这是必需的,因为可变参数模板是贪婪的,几乎可以匹配任何东西,包括在提供类类型的非 const 左值时被认为是比复制构造函数更好的构造函数。
关于c++ - 如何在 C++ 中为嵌套模板数字类型类编写构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71727991/