我有一个getter对象,它返回一个Type类型的对象,定义如下:
typedef boost::variant<int, std::string> Empty;
Run Code Online (Sandbox Code Playgroud)
通常情况下,我既没有返回int也没有返回字符串,而是必须返回一个空状态.你觉得我怎么回这个州?
a)typedef一个Empty类型并将其添加到变体中:boost::variant<int, std::string, Empty>.
b)返回Type()
c)抛出异常
d)返回boost :: shared_ptr,在空的情况下指向NULL.
正确的答案是使用boost::blank一个不含任何内容的变体.因此,您的变体typedef如下所示:
typedef boost::variant<boost::blank, int, std::string> Empty;
Run Code Online (Sandbox Code Playgroud)
blank是专门为此而设计的,并且variant具有基于它的特殊代码.通过使用它,您可以在复制时获得无内存分配保证(如果成员不在副本上分配).这很好.
由于您的变体可能是"空的",因此所有处理访问者都可以处理它.添加额外的访问者路径通常比基于某种optional或某种东西的许多条件更方便.不同的代码路径将本地化到访问者,这通常比一个更有意义optional<variant>.
| 归档时间: |
|
| 查看次数: |
951 次 |
| 最近记录: |