"转换为 "const foo"- C++-6ren"> "转换为 "const foo"- C++-我有一个类似的函数(请不要关心通过引用返回临时值。这只是一个解释问题的例子), const foo& get_const() { foo f; return f; } 这显然无法编译。-6ren">
gpt4 book ai didi

c++ - 从 "foo"转换为 "const foo"- C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:16 24 4
gpt4 key购买 nike

我有一个类似的函数(请不要关心通过引用返回临时值。这只是一个解释问题的例子),

const foo<const int>& get_const()
{
foo<int> f;
return f;
}

这显然无法编译。我正在寻找一种方法来确保调用者不会更改 Tfoo .我怎样才能确保这一点?

我已经看到 boost::shared_ptr 的类似行为. shared_ptr<T>可转换为 const shared_ptr<const T> .我不知道它是怎么做到的。

任何帮助都会很棒。

最佳答案

编译器看到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;
};

关于c++ - 从 "foo<T>"转换为 "const foo<const T>"- C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290460/

24 4 0