模板引用折叠:为const引用返回类型去除cv限定符

3
我有一个通用的包装类。
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;};
};

这个类实际上是多态类层次结构的一部分,涉及重写get函数,但我只关注这个类来提问。

因此,对于常规非引用类型的T,它按预期工作。 我的原始计划是有一个单独的Reference<T>类,除了它构造并管理引用类型外,其他都一样。

然而,这个类可以接受T&值,并执行相同的操作,这要感谢方便的引用折叠。根据标准,const将在构造函数中被丢弃,同时按照预期折叠为T&。

接口中唯一看起来有问题的是cv限定的get函数的返回类型。在这种情况下,我不希望const被丢弃,因为在这种情况下内部不应该是可变的,但我相信按照标准,const会被丢弃。

是否有解决方法或者能够明确告诉编译器我想要那种类型的签名?我知道我可以进行局部特化,但那将导致类的其余部分耦合度很高,除了这个小细节,我几乎可以避免。也许有一些元编程技巧可以做到?


2
返回 typename std::remove_reference<T>::type const & - T.C.
1个回答

2
你可以使用 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;};
};

回想起来,我感到有些傻,因为这个问题其实在标准库中就有解决方法。 - bathtub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接