我有这个非常通用的包装类
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将被删除。
是否有解决方法或明确告诉编译器我想要该类型的签名的方法。我知道我可以部分专业化,但这对于本课程的其余部分来说需要大量的耦合,除了这个小细节之外我几乎可以避免。也许我可以做一些元程序吗?
答案 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;};
};