gpt4 book ai didi

c++ - 将 boost::optional 与常量类型一起使用 - C++

转载 作者:太空狗 更新时间:2023-10-29 21:08:51 25 4
gpt4 key购买 nike

我有一个容器类,它使用 boost::optional 来保存值。这是代码,

template<typename T>
struct traits
{
typedef T value_type;
typedef T& reference;
};

template<typename T>
struct traits<const T>
{
typedef const T value_type;
typedef const T& reference;
};

template<typename T>
struct traits<T*>
{
typedef T* value_type;
typedef T* reference;
};

template<typename T>
struct traits<const T*>
{
typedef const T* value_type;
typedef const T* reference;
};

template<typename T>
class container
{
public:

typedef typename traits<T>::reference reference;
typedef typename traits<T>::value_type value_type;

container() {}

void set(reference value) {
op.reset(value);
}

reference get() const {
return boost::get(op);
}

private:
boost::optional<value_type> op;
};

int main()
{
foo f;
container<const foo> c;
c.set(f);
return 0;
}

它适用于除 const 之外的其他类型。当我使用 const 类型时出现错误(const foo* 工作正常)。

  1. boost::optional 是否支持常量类型?如果不是,我该如何解决这个问题?
  2. 是否有现成的特征实现可用,我可以使用它而不是定义我自己的特征?

任何帮助都会很棒!

最佳答案

问题不在于 boost::optional,而在于您尝试执行的操作的逻辑。首先,您创建一个 const 容器,然后尝试修改其中包含的内容。如果这有效,我会感到惊讶。

我认为您可能应该像标准容器(如 vector)那样做,并禁止不可复制的模板参数。

否则,当 T 不可复制时,您的 set 方法将无法工作,您将不得不忍受这一事实,并提供一个执行初始化的构造函数:

class container
{
public:

container(reference init_value) : op(init_value) {}

};

int main()
{
foo f;
container<const foo> c(f); // OK
// c.set(f); NO
return 0;
}

关于c++ - 将 boost::optional 与常量类型一起使用 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com