标签: boost-optional

如何划分boost :: optional <double>?

我有这样的代码:

boost::optional<double> result = _ind1.Value() / _ind2.Value();
Run Code Online (Sandbox Code Playgroud)

每个arg boost::optional<double>也是:

boost::optional<double> Value() {
    return value;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

Error 1 error C2676: binary '/' : 'boost::optional<T>' does not define this operator or a conversion to a type acceptable to the predefined operator 2 IntelliSense: no operator "/" matches these operands operand types are: boost::optional<double> / boost::optional<double>

我明白分裂似乎没有定义.我希望结果是boost::none两个参数中的任何一个none- 否则我希望它是正常的双重除法.我应该自己写吗?

c++ boost boost-optional

3
推荐指数
1
解决办法
581
查看次数

将原始指针视为基于范围的for循环中的范围

对于for-range循环语法,如何使原始指针的行为类似于范围.

double five = 5;
double* dptr = &five;
for(int& d : dptr) std::cout << d << std::endl;// will not execute if the pointer is null
Run Code Online (Sandbox Code Playgroud)

动机:

现在,vox populi可以将boost::optional(未来std::optional)值视为范围,因此可用于范围循环http://faithandbrave.hateblo.jp/entry/2015/01/29/173613.

当我重写我自己的简化版本时:

namespace boost {
    template <class Optional>
    decltype(auto) begin(Optional& opt) noexcept{
        return opt?&*opt:nullptr;
    }

    template <class Optional>
    decltype(auto) end(Optional& opt) noexcept{
        return opt?std::next(&*opt):nullptr;
    }
}
Run Code Online (Sandbox Code Playgroud)

用作

boost::optional<int> opt = 3;
for (int& x : opt) std::cout << x << std::endl;
Run Code Online (Sandbox Code Playgroud)

在查看代码时,我想象它也可以推广到原始(可空)指针.

double five = 5; …
Run Code Online (Sandbox Code Playgroud)

c++ pointers for-loop c++11 boost-optional

3
推荐指数
1
解决办法
1383
查看次数

包含 boost/Optional.hpp 时发生 C2143 语法错误

我遇到了一个我无法理解的编译时错误。我尝试在我的代码中使用boost::optional,一旦包含,boost/optional.hpp我就无法再构建我的项目。如果我注释掉这个 include 语句,它就会起作用。我什至在我的代码中还没有任何实际用法boost::optional,只是类标头中的 include 语句(请参阅下面的完整标头)。编译器错误C2143 syntax error: missing ',' before '<'发生在另一个 Boost 标头中boost/utility/compare_pointees.hpp(请参阅下面的 GitHub 链接)。我还成功地使用了 Boost 中的其他东西,就像boost::filesystem::path在同一个项目中一样,所以我的 Boost 发行版应该没有问题。

这是我的环境:Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3boost 1.62.0。我还使用第三方库C++ REST SDK,其他都是 C++ 标准库的东西。

我的标题看起来像这样。我想添加一个新方法作为boost::optional<size_t>返回类型。

#pragma once

#include <boost/optional.hpp>   // <==== ERROR

// C++ REST SDK
#define _TURN_OFF_PLATFORM_STRING
#include <cpprest/http_listener.h>
#include <cpprest/http_msg.h>

namespace SANDBOX::REST
{
   class HttpGetHandler
   {
   public:
       virtual void …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-optional visual-studio-2015 option-type

3
推荐指数
1
解决办法
3586
查看次数

c ++中的可选引用是否可以保留对象生命?

说我有:

#include <iostream>
#include "boost/optional.hpp"
struct cat
{
    int paw = 4;
};

int main()
{
    boost::optional<cat&> z;
    {
        cat realCat = cat();
        z = realCat;
    }
    std::cout << z->paw << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面,没有理由期望打印出一致的结果,就像realCat发布的那样}?还是optional保留了生命realCat

c++ boost boost-optional

3
推荐指数
1
解决办法
297
查看次数

提升Spirit Karma多个选项

我看到一个错误,我没有看到解决方案.一,相关代码:

namespace C {

    struct RangeEntry {
        size_t byte;
        boost::optional<size_t> bit;
    };

    struct Range {
        RangeEntry firstPart;
        boost::optional<RangeEntry> secondPart;
        boost::optional<size_t> shift;
    };
}

BOOST_FUSION_ADAPT_STRUCT(
    C::RangeEntry,
    (size_t, byte)
    (boost::optional<size_t>, bit)
)

BOOST_FUSION_ADAPT_STRUCT(
    C::Range,
    (C::RangeEntry , firstPart)
    (boost::optional<C::RangeEntry> , secondPart)
    (boost::optional<size_t> , shift)
)

... Declare the rules ...

karma::rule<Iterator, C::Range()> range;
karma::rule<Iterator, C::RangeEntry()> range_part;

... Define rules ...

range_part %= no_delimit[ulong_ << -(lit(":") << ulong_)];
range %= no_delimit[range_part << -(lit("-") << range_part)] << -(lit("<<") << ulong_);
Run Code Online (Sandbox Code Playgroud)

在该range %=部分,我得到编译错误

/usr/include/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp:504:30: …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-karma boost-optional

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

如何将构造函数参数转发给boost :: optional

我有以下简单的结构:

struct X
{
    X(std::string name, int value): name_(name), value_(value){}

    std::string name_;
    int value_;
};
Run Code Online (Sandbox Code Playgroud)

我想将其与boost可选一起使用而不进行复制。这是一个选择:

boost::optional<X> op;
op.emplace("abc", 5);
Run Code Online (Sandbox Code Playgroud)

是否可以不使用emplace函数?(我的意思是一行表达式)

c++ boost c++11 boost-optional

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

模板模板参数与函数模板的等效行为

我想写这样的代码:

template <typename K, typename T, template <typename, typename> class C>
boost::optional<T> search(const C<K, T>& dict,
                          const K& key)
{
  auto it = dict.find(key);

  if (it != dict.end()) {
    return it->second;
  } else {
    return boost::none;
  }
}
Run Code Online (Sandbox Code Playgroud)

希望能够(std::[unordered_][multi]map)使用字典界面在各种容器上调用上述函数,如:

std::map<std::string, Foo> strToFoo;
auto val = search(strToFoo);
Run Code Online (Sandbox Code Playgroud)

我知道功能模板不允许使用模板模板参数.但还有另一种方法可以达到同样的效果吗?

c++ templates template-templates c++11 boost-optional

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

对托管对象执行std :: optional和boost :: optional尊重对齐限制吗?

如果一个类T具有对齐要求,例如由alignas关键字指定的对齐要求,std::optional<T>并且boost::optional<T>保证尊重所述对齐?

如果它们只是T对象和a的包装类bool initialized,那么它们会T根据需要自动对齐它们的成员,但标准和boost文档声明它们不能容纳任何对象并且很好地处理昂贵的构造对象.据我所知,他们不仅仅包含一个T.相反,它们似乎分配了一个缓冲区,T手动构造或销毁它.因此,C++语言不会自动对齐缓冲区,因为它不是类型T.

那么,做std::optional<T>boost::optional<T>正确对齐他们的托管T对象?他们是否也提供optional<T>::operator newoptional<T>::operator new[]尊重对齐要求?

c++ boost boost-optional c++17 stdoptional

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

在可选结构memeber中分配成员

分配可选结构成员的最佳方式是什么?例如,我有一个结构:

struct B{
public:
    int x;
}


struct A{
public:
    boost::optional<B> b;
};


void foo(){
   A a;
   a.b.x = 10; //Runtime exception because a.b is not initialized. 
}
Run Code Online (Sandbox Code Playgroud)

一种选择是定义临时B结构并将其分配给A:

void foo(){
    A a;
    B tmp;
    a.b = tmp;
    a.b.x = 10; //OK. 
}
Run Code Online (Sandbox Code Playgroud)

要么:

void foo(){
    A a;
    a.b = B();
    a.b.x = 10; //OK. 
}
Run Code Online (Sandbox Code Playgroud)

有更明确的方法吗?

c++ boost-optional

0
推荐指数
1
解决办法
164
查看次数