模板参考折叠删除 const 参考 Return 类型的 cv 限定符

Template Reference Collapsing Dropping cv-qualifiers for const Reference Return Type

我有这个非常通用的包装纸class

template<typename T>
class Raw
{
    T obj;

public:
    Raw() {};
    Raw(const T& init): obj(init) {};

    T& get() {return obj;};
    const T& get() const {return obj;};
};

这个 class 实际上是其他 class 涉及覆盖 get 函数的多态层次结构的一部分,但我将这个 class 孤立出来解决我的问题。

所以对于 T 的常规非引用类型,这可以正常工作。 我最初的计划是有一个单独的 class Reference<T> 它除了构造和管理引用类型之外做同样的事情。

但是,这个 class 给定一个 T& 值,就可以做到这一点,这要归功于方便的花花公子参考折叠。 const 将按照标准在构造函数中删除,并根据需要折叠成 T&。

接口的唯一问题是 cv 限定的 get 函数的 return 类型。在这种情况下,我不希望删除 const,因为在这种情况下,内部结构不应该是可变的,但是我相信根据标准,const 会被删除。

是否有解决此问题的方法或明确告诉编译器我想要该类型的签名的方法。我知道我可以部分专业化,但这将需要对 class 的其余部分进行大量耦合,除了这个小细节外,我几乎可以避免。也许我可以做一些元编程?

您可以使用 std::remove_reference 删除引用并将其添加回来:

#include <type_traits>

template<typename T>
class Raw
{
    T obj;
    using NR = std::remove_reference_t<T>;

public:
    Raw() {};
    Raw(const T& init): obj(init) {};

    NR& get() {return obj;};
    const NR& get() const {return obj;};
};