boost::optional<T>
(1.51) 提供了一种构造对象的方法,这种方法对我的用户来说是非常危险的,我想阻止这种方法。假设我有自己的整数类,我想传递一个可选的整数并将其存储在某个类中:
class myint {
public:
int m_a;
myint (int r_a) : m_a(r_a) {
}
};
struct myclass {
boost::optional<myint> content;
myclass (const boost::optional<myint>& arg) : content(arg) {
}
};
现在,这是用户使用该类的方式:
myclass(myint(13)); //correct use
myclass(boost::none); //correct use
myclass(myint(0)); //correct use
myclass(0); //INCORRECT use, this easy typo
//equates boost::none which
//is not what the user meant
我想了解这里发生了什么并防止这种行为。
有趣的是,
myclass(1); //does not compile
boost::none
对于我的领域来说,这完全是一个有效的值,但是boost::none
当用户尝试输入 a 时偷偷摸摸是0
非常误导和危险的。
意图可能有点隐藏,因为我并没有真正推出一个myint
课程,而且我真的没有一个class myclass
几乎没有任何目的的课程。无论如何,我需要向函数发送 10 个左右的可选整数,而重复数据删除不起作用。(你可以想象我问了你的年龄、身高和财富,还有三个特殊的按钮可以检查你是否不想回答问题)
我发布了一个似乎在下面有效的答案(根据 Mooing 的 Duck & Ilonesmiz 建议构建,但更轻)。不过,我很高兴听到有关它的评论。