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

时间:2015-04-21 02:03:35

标签: c++ c++11 template-meta-programming lvalue

我有这个非常通用的包装类

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&amp;价值,就是这样,感谢方便的花花公子参考折叠。 const将按照标准在构造函数中删除,并折叠为T&amp;根据需要。

接口唯一看似问题是cv-qualified get函数的返回类型。在这种情况下,我不希望删除const,因为在这种情况下内部不应该是可变的,但我相信根据标准,const将被删除。

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

1 个答案:

答案 0 :(得分: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;};
};