标签: boost-optional

C++标准库中的boost :: optional替代品

我试图让我的程序在没有boost使用的情况下工作,但是找不到某些有用模式的替代方案.也就是说,我boost::optional在标准库中找不到-likewise模式.是否有boost::optional(C++ 11或其他地方)的标准替代方案?

c++ boost std c++11 boost-optional

19
推荐指数
2
解决办法
1万
查看次数

boost :: optional <T&> vs T*

我试图了解何时是使用某些结构的正确时间,boost并对使用boost::optional引用有疑问.

假设我有以下类,使用boost::optional:

class MyClass {
public:
   MyClass() {}

   initialise(Helper& helper) {
      this->helper = helper;
   }

   boost::optional<Helper&> getHelper() {
      return helper;
   }

private:
   boost::optional<Helper&> helper;
}
Run Code Online (Sandbox Code Playgroud)

为什么我会使用上面的代替:

class MyClass {
public:
   MyClass() : helper(nullptr) {}

   initialise(Helper& helper) {
      this->helper = &helper;
   }

   Helper* getHelper() {
      return helper;
   }

private:
   Helper* helper;
}
Run Code Online (Sandbox Code Playgroud)

它们都传达了相同的意图,即getHelper可以返回null,并且调用者仍然需要测试是否返回了帮助程序.

boost::optional如果你需要知道'a value' nullptr和'not a value' 之间的区别,你应该只使用吗?

c++ boost boost-optional

16
推荐指数
2
解决办法
3330
查看次数

将boost :: optional转换为bool

我怎么能阻止编译这段代码的最后一行?

#include <boost/optional.hpp>

int main()
{
    typedef boost::optional<int> int_opt;
    int_opt opt = 0;
    bool x = opt;  // <- I do not want this to compile
}
Run Code Online (Sandbox Code Playgroud)

最后一行不检查opt包含的int值,而是编译为bool的类型转换,并且似乎不是用户的意图.

安全布尔成语似乎与此相关吗?

c++ boost type-conversion boost-optional

14
推荐指数
1
解决办法
1万
查看次数

使用std :: optional <int>与使用int一样有效吗?

我有一个四/八树数据结构.我将一个单元格的子索引/ ptrs存储在一个数组中.数组中的每个位置表示子项相对于其父项的位置,例如2D:

// _____________
// |     |     |
// |  2  |  3  |
// |_____|_____|
// |     |     |
// |  0  |  1  |
// |_____|_____|
// for each cell, 4 children are always stored in row-major order
std::vector<std::array<Integer,4>> children;
Run Code Online (Sandbox Code Playgroud)

我知道子项的最大数量是Integer类型可以表示的值的子集.因此,我可以通过使用像' -1for ' Integer = intstd::numeric_limits<unsigned>::max()for for 这样的''magic''来识别一个单元格是否遗漏了一个孩子Integer = unsigned.这是std::optional<Integer>不能假设的.

据我所知,这种魔法价值的使用是其存在的理由之一std::optional.不过,我担心std::vector<std::optional<int>>内循环的表现.

所以,

  • 表现会不会std::vector<std::optional<int>>比那更差std::vector<int>?(我已经在对"不存在的"价值进行比较).

  • 或者,可以std::optional优化实施以提供与原始相同的性能int吗?如何?

std::optional在我的数据结构中混合我的函数的返回类型和魔术值听起来是一个非常糟糕的主意.我更喜欢保持一致,要么使用其中一个(至少在同一个上下文中).虽然我可以重载与幻数进行比较的函数: …

c++ performance optional boost-optional c++14

13
推荐指数
1
解决办法
2511
查看次数

init boost ::不可复制对象的可选项

boost::optional< T >如果基础类型T是非默认的可构造的,不可复制/可移动的,但我应该做什么来初始化,但是一个实例仍然可以存在?

是否boost::optional由于任何语义原因禁止使用某些成员函数template< typename... Args > boost::optional< T >::construct(Args && ...args),它将所有参数传递给就地operator new完全构造对象(对于非ref类型T)?Variant是具有非成员函数的std::make_shared< T >.

在我看来,我的问题可以通过使用std::unique_ptr/ 解决std::shared_ptr,但在这种情况下我的问题是:"为什么boost::optional进展被冻结?".

boost default-constructor noncopyable boost-optional

11
推荐指数
1
解决办法
3510
查看次数

我可以从constexpr函数返回一个可选项吗?

  • 我可以optionalconstexpr函数返回吗?
  • 为什么?
  • 如果是,它是如何工作的?

我感兴趣的两个boost::optionalstd::optional.他们的行为是否相同?

c++ boost std constexpr boost-optional

10
推荐指数
2
解决办法
595
查看次数

使用std :: optional参数调用函数

我有一个功能,其签名是:

void func(std::optional<std::string> os = std::nullopt);
Run Code Online (Sandbox Code Playgroud)

(我正在走样,std::experimental::optional直到std::optional官方可用.)

但是,我很难干净地称呼它.编译器将拒绝执行两个隐式转换(const char*std::stringstd::optional<std::string>)与原始C-字符串字面来调用它.我可以这样做:

func(std::string("Hello"));
Run Code Online (Sandbox Code Playgroud)

并且编译器将确定需要a std::optional,并进行转换.但是,这太冗长了.感谢C++ 11,我也可以这样做:

func({"Hello"});
Run Code Online (Sandbox Code Playgroud)

虽然这样做更好,但仍然不理想.我希望能够像任何其他需要的一样调用此函数std::string.这可能吗?使函数采用另一种参数类型是可以的,只要它的行为类似于/可以直接转换为std::optional.谢谢.

c++ optional c++-standard-library boost-optional

10
推荐指数
2
解决办法
3057
查看次数

将boost :: optional与boost :: adapters :: indirected一起使用

我正在尝试编译以下代码:

#include <iostream>
#include <iterator>
#include <vector>

#include <boost/assign/std/vector.hpp>
#include <boost/optional.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/copy.hpp>

int main( int argc, char ** argv )
{
  using namespace boost::assign;
  using boost::adaptors::indirected;

  std::vector<boost::optional<unsigned> > values;
  values += 1u,2u,3u;
  boost::copy( values | indirected, std::ostream_iterator<unsigned>( std::cout, " " ) );
  std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到了一些错误,例如没有命名的类型element_typeboost::optional<unsigned>.该参考页页,但是,说,单前提条件是存在operator*()一元函数.有没有办法让它发挥作用?

c++ boost boost-optional

9
推荐指数
1
解决办法
1143
查看次数

如何防止boost :: optional <T>被错误地构造为0?

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) {
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,这是用户如何使用该类:

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
Run Code Online (Sandbox Code Playgroud)

我想了解这里发生了什么,并防止这种行为.


有趣的是,

myclass(1);              //does not compile
Run Code Online (Sandbox Code Playgroud)

boost::none对于我的领域来说,这完全是一个有效的价值,但是boost::none当用户试图输入时,有一个偷偷摸摸的东西0是极其误导和危险的.

意图可能有点隐藏,因为我并没有真正推出一个myint课程而且我真的class myclass没有任何目的.无论如何,我需要向函数发送10个左右的可选ints,并且重复数据删除不起作用.(你可以想象我问你的年龄,身高和财富,还有三个特殊按钮可以检查你是否不想回答问题)


我发布了一个似乎在下面工作的答案(根据Mooing的Duck&Ilonesmiz建议,但更轻).不过,我很高兴听到有关它的评论.

c++ boost boost-optional

8
推荐指数
1
解决办法
1186
查看次数

boost可选和std :: experimental可选赋值之间的区别

通常,当一个函数返回时,boost::optional我看到很多人返回一个空括号{}来指定一个空值,这样可以正常运行并且比返回时更短boost::none.

我尝试做类似于清空a的操作boost::optional<int>,但是当在右侧调用带有空括号的复制赋值运算符(或者很可能是移动赋值操作)时,空括号将转换为int,然后将该值赋值给可选的,所以我最终将变量设置为0而不是我期望的空值.这是一个示例https://godbolt.org/g/HiF92v,如果我尝试相同的,std::experimental::optional我得到我期望的结果(只是用示例中的std :: experimental :: optional替换,你会看到指令成为mov eax, eax).

另外,如果我尝试使用不同的模板参数进行boost可选(非整数类型),一些编译器会编译(使用我期望的行为,这里有一个示例http://cpp.sh/5j7n)而其他编译器则没有.因此,即使对于相同的lib,根据模板arg,行为也是不同的.

我想了解这里发生了什么,我知道这与我使用C++ 14功能的一个事实有关,这个库没有考虑到它进入设计.我读了boost/optional标题,但我迷失了细节,我也尝试研究编译的代码,而没有内联类似的结果.

我正在使用gcc 4.9.2和-std = c ++ 14并且提升1.57.

顺便说一句:我知道我应该使用boost::optional::resetboost::none,但我试图与其余代码库中的语义保持一致.

c++ boost boost-optional gcc4.9 c++14

8
推荐指数
1
解决办法
2453
查看次数