C++ 17 允许为类创建推导指南,它们也可以应用于 auto 吗?
这是我正在尝试实现的快速示例。
#include <stdio.h>
struct Rect
{
int Rect;
};
template<typename T, int k = 0>
class TemplatedClass : public T
{
public:
static constexpr int S = k;
T value;
TemplatedClass() {}
TemplatedClass(T val) : value(val) {}
};
TemplatedClass(TemplatedClass<Rect, 0>) ->TemplatedClass<Rect, 66>;
TemplatedClass<Rect, 0> DrawRect()
{
return {};
}
int main()
{
auto r = DrawRect();
r.Rect = 0;
TemplatedClass a = DrawRect();
a.Rect = 0;
printf("r.S %d \n", r.S); // Should be 66
printf("a.S %d \n", a.S); // Should be 66
return 0;
}
代码对于 auto 变量返回 0,无论如何我可以让它回退到创建的推导指南。该函数仍然必须保留模板 k = 0。
我知道 auto 是为了使用函数的返回类型,但是可能有什么技巧可以覆盖这种类型吗?
嗯,我不明白。
您说的是没有任何模板参数的
TemplatedClass
是 TemplatedClass<Rect, 66>
由于函数显式返回
TemplatedClass<Rect, 0>
,因此 auto
行为是正确的。
另一个用例,您只是根据推导指南,基于另一种类型创建一种类型。
可能有什么技巧可以覆盖这个类型
是的,你已经做到了。
TemplatedClass a = DrawRect();
或
TemplatedClass<Rect, 66> DrawRect()
{
return {};
}
但老实说,这不是大多数人使用推导指南的方式,它使代码非常非常混乱,如果你希望 DrawRect 函数返回一个带有文字 66 的类,那么就这样做。