我有一个通用的包装类。
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会被丢弃。
是否有解决方法或者能够明确告诉编译器我想要那种类型的签名?我知道我可以进行局部特化,但那将导致类的其余部分耦合度很高,除了这个小细节,我几乎可以避免。也许有一些元编程技巧可以做到?
typename std::remove_reference<T>::type const &
。 - T.C.