标签: boost-optional

尝试使用boost :: optional失败了

我一直在尝试使用boost可选的函数来返回一个对象或null,我无法弄明白.这是我到目前为止所拥有的.任何有关如何解决此问题的建议将不胜感激.

class Myclass
{
public:
    int a;
};

boost::optional<Myclass> func(int a)  //This could either return MyClass or a null
{
    boost::optional<Myclass> value;
    if(a==0)
    {
        //return an object
            boost::optional<Myclass> value;
        value->a = 200;

    }
    else
    {
        return NULL;
    }

    return value;
}

int main(int argc, char **argv)
{
    boost::optional<Myclass> v = func(0);
    //How do I check if its a NULL or an object

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:

这是我的新代码,我收到了编译错误 value = {200};

class Myclass
{
public:
    int a;
};

boost::optional<Myclass> func(int a) …
Run Code Online (Sandbox Code Playgroud)

c++ boost-optional

5
推荐指数
1
解决办法
6929
查看次数

什么是boost :: optional效率?

我有以下内容:

class Obj;
typedef std::map<string, string> StrMap;
std::map<std::string, std::pair<Obj, StrMap> > complexMap;
Run Code Online (Sandbox Code Playgroud)

问题是对于complexMap中的一些条目,StrMap将是空的,我根本不会使用它,所以为了提高效率,我正在考虑使用boost :: optional.我的问题是什么是提升效率::可选,我担心通过支付它的价格,我最终将无法获得任何收益.

c++ dictionary boost-optional

5
推荐指数
1
解决办法
2504
查看次数

boost ::从函数返回可选

我正在审查一些生产代码,其中一个函数说它将返回一个boost::optional,但它只返回一个double:例如

boost::optional<double> Foo(){
   double a = 1.0;
   double b = 2.0;
   return a + b;
}
Run Code Online (Sandbox Code Playgroud)

这种可接受的风格/是否有任何不安全的情况?

c++ boost implicit-conversion boost-optional

5
推荐指数
1
解决办法
747
查看次数

boost ::可选和类型转换

我在想,如果有蒙上了一种优雅的方式boost::optional<A>boost::optional<B>B可以从构造A,虽然明确地.这有效:

# include <boost/optional.hpp>

class Foo
{
  int i_;
public:
  explicit Foo(int i) : i_(i) {}
};

int main()
{
  boost::optional<int> i;
  ... // i gets initialized or not
  boost::optional<Foo> foo;
  foo = boost::optional<Foo>(bool(i), Foo(i.value_or(0 /*unused value*/)));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但需要放入一些永远不会被使用的价值似乎很尴尬.还有更好的建议吗?

c++ boost boost-optional

5
推荐指数
1
解决办法
2065
查看次数

使用boost :: python包装boost ::可选

有没有办法包装boost::optional<T>类型对象以通过公开它boost::python::class_(用于BOOST_PYTHON_MODULE

struct Foo 
{
    boost::optional<int> bar;
};

BOOST_PYTHON_MODULE(module_name)
{
    class_<Foo>("Foo")
    .def_readwrite("bar", &Foo::bar);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在Python中期望的是AttributeError

import module_name
f = module_name.Foo()
print f.bar
Run Code Online (Sandbox Code Playgroud)

因为bar尚未设置的值。而TypeError

import module_name
f = module_name.Foo()
f.bar = "string"
Run Code Online (Sandbox Code Playgroud)

barint类型。

另一个相关的问题是以相同的方式导出boost::python::indexing_suite容器类型的类的对象。

使用boost::pythonapi 是否可以解决问题?

c++ python boost boost-python boost-optional

5
推荐指数
1
解决办法
948
查看次数

可选的<double>可以实现为8字节对象吗?

是否可以实现std :: optional,以便sizeof(std::optional<double>) == 8通过某种方式使用它可以将字符存储在NAN中,请参阅http://en.cppreference.com/w/cpp/numeric/math/nan?是否有实现这样做?它可以在标准中提供的功能方面完成吗?

c++ std optional boost-optional

5
推荐指数
1
解决办法
231
查看次数

boost :: optional deprecated get_value_or

我怀疑boost :: optional's get_value_or已被弃用,因为如果将rvalue作为default参数传递则不安全.但是,有时可以引用可选值或默认备选方案.

以下是安全的吗?

template<typename T>
T const& get_reference_or(boost::optional<T> const& opt, T const& alt)
{
    if (opt) return opt.get();
    else return alt;
}

template<typename T>
T const& get_reference_or(boost::optional<T> const&, T&&) = delete;
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference boost-optional

5
推荐指数
1
解决办法
1085
查看次数

boost::optional 奇怪的未初始化问题

gcc 时不时地通过 may-uninitialized 发出有关 boost::optional 工作的警告,但我认为这是误报(如此处描述的https://github.com/boostorg/optional/issues/72)。

但是现在valgrind在运行时报告了同样的问题,所以出了点问题,不知道是什么问题:

//Foo.hpp
#include <boost/optional.hpp>
#include <boost/variant.hpp>
#include <cstdio>
#include <string>

extern "C" {
typedef struct FooOpaque FooOpaque;

FooOpaque *Foo_new();

void Foo_delete(const FooOpaque *self);
}

class Foo {
public:
  explicit Foo(FooOpaque *o) noexcept : self_(o) {}
  Foo(const Foo &) = delete;
  Foo &operator=(const Foo &) = delete;

  Foo(Foo &&o) noexcept : self_(o.self_) { o.self_ = nullptr; }
  Foo &operator=(Foo &&o) noexcept {

    assert(this != &o);
    free_mem(this->self_);
    self_ = o.self_;
    o.self_ = nullptr;
    return …
Run Code Online (Sandbox Code Playgroud)

c++ gcc boost c++11 boost-optional

5
推荐指数
0
解决办法
428
查看次数

Boost可选隐式转换为bool?

我正在读一些代码而且我遇到了一些我不理解的东西.它是关于测试是否初始化Boost :: optional值.它使用提供ASSERT_TRUE()宏的gtest框架.

#include "gtest\gtest.h"

void test() {
    boost::optional<someClass> opt = someFunc();
    ASSERT_TRUE(!!opt);
}
Run Code Online (Sandbox Code Playgroud)

为什么我需要!!之前的opt?是boost::optional不是隐式转换为bool,这是宏所需要的?我认为用它ASSERT_TRUE(opt)来检查opt是否保持正确值是足够的吗?

c++ boost googletest boost-optional

4
推荐指数
1
解决办法
1044
查看次数

为了std :: is_convertible的目的,为什么boost :: optional <T>不能转换为bool

我有

auto result = std::is_convertible
    < boost::optional<int>
    , bool
    >::value;

static_assert( result , "task should return bool" );
Run Code Online (Sandbox Code Playgroud)

它无法编译.std :: is_convertible的定义是

template< class From, class To > struct is_convertible;
Run Code Online (Sandbox Code Playgroud)

并且可选显然可以转换为布尔值,因为我们总是使用它

void(boost::optional<int> const & value){
    if(value){
        std::cerr << *value << endl; 
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里想念的是什么?

c++ boost-optional

4
推荐指数
1
解决办法
129
查看次数