Nav*_*K N 5 c++ templates constants const-correctness
我有一个函数(请不要关心通过引用返回临时.这只是一个解释问题的例子),
const foo<const int>& get_const()
{
foo<int> f;
return f;
}
Run Code Online (Sandbox Code Playgroud)
这显然不会编译.我正在寻找一种方法,以确保调用方不会改变T的foo.我该如何确保?
我见过类似的行为boost::shared_ptr.shared_ptr<T>可转换为const shared_ptr<const T>.我无法弄清楚它是如何做到这一点的.
任何帮助都会很棒.
Tyl*_*nry 10
编译器看到foo<T>和foo<const T>两个完全不同的,不相关的类型,所以foo类需要明确支持这个就像任何其他的转换.如果您可以控制foo类,则需要提供复制构造函数或隐式转换运算符(或两者).
template<typename T>
class foo
{
public:
// Regular constructor
foo(T t) : t(t) {}
// Copy constructor (works for any type S convertable to T, in particular S = non-const T if T is const)
// Remember that foo<T> and foo<S> are unrelated, so the accessor method must be used here
template<typename S> foo (const foo<S>& copy) : t(copy.getT()) {}
// Accessor
T getT() const { return t; }
// Conversion operator
operator foo<const T> () const { return foo<const T>(t); }
private:
T t;
};
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,该boost::shared_ptr实现有一个非显式构造函数,它将引用const T&作为参数,然后使用const_castRHS 指针上的 a 来删除const,从而允许它们之间进行隐式转换。
像这样的东西:
shared_ptr(const shared_ptr<const T>& r) : ptr(const_cast<T*>(r.ptr)) {}
Run Code Online (Sandbox Code Playgroud)
这就是您要找的吗?
| 归档时间: |
|
| 查看次数: |
1441 次 |
| 最近记录: |