作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一些我想“嵌套”数字类型的东西。我正在努力以右侧可以是数字文字的方式编写构造函数。这是我的问题的缩小版本:
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/
我是一名优秀的程序员,十分优秀!