从"foo <T>"转换为"const foo <const T>" - C++

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)

这显然不会编译.我正在寻找一种方法,以确保调用方不会改变Tfoo.我该如何确保?

我见过类似的行为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)


Pet*_*der 0

如果我没记错的话,该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)

这就是您要找的吗?