C++ 汽车类型推导指南

问题描述 投票:0回答:1

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 是为了使用函数的返回类型,但是可能有什么技巧可以覆盖这种类型吗?

https://godbolt.org/z/PoefK5dnK

c++ c++20 auto deduction-guide
1个回答
0
投票

嗯,我不明白。

您说的是没有任何模板参数的

TemplatedClass
TemplatedClass<Rect, 66>

由于函数显式返回

TemplatedClass<Rect, 0>
,因此
auto
行为是正确的。

另一个用例,您只是根据推导指南,基于另一种类型创建一种类型。

可能有什么技巧可以覆盖这个类型

是的,你已经做到了。

 TemplatedClass a = DrawRect();

TemplatedClass<Rect, 66> DrawRect() 
{
    return {};
}

但老实说,这不是大多数人使用推导指南的方式,它使代码非常非常混乱,如果你希望 DrawRect 函数返回一个带有文字 66 的类,那么就这样做。

© www.soinside.com 2019 - 2024. All rights reserved.