小编seh*_*ehe的帖子

从libevent移植到boost :: asio:什么是ASIO中libevent事件的直接等价物?

我正在尝试向基于libevent的库反向移植以使用ASIO后端(从而在单个应用程序中避免多个事件循环).还有其他方法可以解决"问题",但我对此感兴趣

我没有event在Boost :: ASIO文档中看到对象的直接等价物(或者更确切地说,是一个句柄 - 因为libevent是用纯C编写的); boost :: asio :: strand看起来很熟悉,但它似乎没有遵循libevent的模式:创建,期望,接收,做工作{,重复}.

我需要的是拥有一组对象/事件/事件回调,除非回调(通过套接字事件)发生,否则可以创建和忘记回调,运行在io_service循环之上; Boost中有类似的东西吗?

c++ boost boost-asio

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

如何获取boost json以使用正确的数据类型

当我put_value使用int时,它会以字符串形式写入。有人知道如何将其打印为int吗?

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using boost::property_tree::ptree;
using namespace std;

int main(int argc, char* argv[]) {

    ptree node;
    node.put("string", "text here");
    node.put("int", 1);//outputs as "1" and should be 1
    write_json(cout, node, false);//{"string":"text here","int":"1"}

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

c++ json boost boost-propertytree

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

使用 lambda 或外部函数作为spirit.qi 语义动作

我\xca\xbcm 正在尝试创建基于Boost.Spirit.Qi 的解析。有一个像calc_utree这样的例子,我试图扩展用作语义操作的内容。

\n\n

例如,通过单独的分配作为语义动作重用相同的方法是很简单的

\n\n
        term =\n            factor [_val = _1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如示例中的字面意思。但是,当我尝试将两者传递到规则定义外部的函数(方法)中,或者甚至将其写为 lambda 时,例如

\n\n
        term =\n            factor [([&] {_val = _1; })]\n
Run Code Online (Sandbox Code Playgroud)\n\n

它会在该位置导致静默误分配:_val保持不变(编译器没有任何错误或警告)。如果我把它改成类似的东西也是一样

\n\n
        term =\n            factor [do_term_factor(_val, _1)]\n<...>\ntemplate <typename D, typename S>\nD& do_term_factor(D& d, S& s) {\n    d = s;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎 I\xca\xbcve 陷入了对Qi和 的主要误解Phoenix。问题是(基本上它们是同一问题的不同形式):

\n\n
    \n
  • Phoenix它们在 C++ lambda 中不\xca\xbct 工作的变量有什么具体之处?
  • \n
  • 如何使其与此类外部操作调用一起工作?
  • \n
\n\n

或者,如果_val没有 ,如何实现PhoenixSpirit文档在这方面似乎相当晦涩。

\n\n

环境详细信息:Boost …

c++ parsing boost-phoenix boost-spirit-qi

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

禁止 Boost 二进制文件(通过猎人下载)

我正在尝试使用 cmake 进行编译并注意到 boost 二进制链接不可用(禁止)。有解决方法吗?

[ 25%] Performing download step (download, verify and extract) for 'Boost'
-- verifying file...
       file='/home/op/.hunter/_Base/Download/Boost/1.66.0/075d0b4/boost_1_66_0.7z'
-- SHA1 hash of
    /home/op/.hunter/_Base/Download/Boost/1.66.0/075d0b4/boost_1_66_0.7z
  does not match expected value
    expected: '075d0b43980614054b1f1bafd189f863bba6600e'
      actual: 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
-- File already exists but hash mismatch. Removing...
-- Downloading...
   dst='/home/op/.hunter/_Base/Download/Boost/1.66.0/075d0b4/boost_1_66_0.7z'
   timeout='none'
-- Using src='https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.7z'
-- Retrying...
-- Using src='https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.7z'
-- Retry after 5 seconds (attempt #2) ...
-- Using src='https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.7z'
-- Retry after 5 seconds (attempt #3) ...
-- Using src='https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.7z'
-- Retry after 15 …
Run Code Online (Sandbox Code Playgroud)

c++ boost cmake bintray cmake-hunter

3
推荐指数
2
解决办法
1326
查看次数

使用 boost::asio::thread_pool 的 C++ 线程池,为什么我不能重用我的线程?

我正在尝试boost::asio::thread_pool在我的应用程序中创建线程池。我创建了以下玩具示例,看看我是否理解它是如何工作的,但显然不明白:)

#include <boost/asio/post.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::asio::thread_pool g_pool(10);

void f(int i) {
    std::cout << i << "\n";
}

int main() {
    for (size_t i = 0; i != 50; ++i) {
        boost::asio::post(g_pool, boost::bind(f, 10 * i));
        g_pool.join();
    }
}
Run Code Online (Sandbox Code Playgroud)

程序输出

0
Run Code Online (Sandbox Code Playgroud)

我对两件事感到困惑:第一,如果我正在等待线程完成使用g_pool.join(),为什么我不能在下一次迭代中重用这些线程。10,20,30,...即,我希望还能看到在后续迭代中打印的数字等。

其次,我正在创建一个大小为 10 的线程池,为什么我至少没有看到 10 个输出呢?我无法理解这个问题。

请告诉我哪里出错了,先谢谢了!

c++ multithreading boost boost-asio threadpool

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

在std算法中否定boost is_directory

boost::filesystem::recursive_directory_iterator end, begin(directory);

auto num_of_files=std::count_if(begin, end, 
        std::not1(boost::filesystem::is_directory)));
Run Code Online (Sandbox Code Playgroud)

我试图在上面的目录迭代器上否定函数is_directory但是我遇到了一堵砖墙.我已经尝试为not1as 指定模板bool(*)(const boost::filesystem::path&)并尝试静态转换函数,但都没有成功.

我知道我可以诉诸lamdba但是如果它有效的话它会更干净.

谢谢

c++ boost negate c++11

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

外部属性映射绑定到boost图库中的std :: vector

我目前正在尝试定义增强图的外部属性.我使用一些捆绑属性作为内部属性:

struct VertexProperties
{
  int demand;
};

struct EdgeProperties
{ 
  uint capacity;
  int cost;
};

typedef adjacency_list <vecS, vecS, bidirectionalS, VertexProperties, EdgeProperties> Graph;
Run Code Online (Sandbox Code Playgroud)

然而,在算法期间我需要一些外部属性,即我希望能够将我的图形的边/顶点映射到存储在std :: vector中的元素,以便我可以通过operator [](Edge)访问它们E).我站在提升文档前面,没有任何线索.好像我需要一个property_map,但我不知道如何将这些与vector一起使用.到目前为止,我发现的唯一例子涉及从顶点到矢量的映射,但由于顶点是无符号整数,因此这是微不足道的.

到目前为止,我对提升感到非常沮丧,我认为这样可以节省我很多时间来自己实现和测试图表类,我真的没有得到这个疯狂的模板元编程的东西......

c++ boost graph boost-graph boost-property-map

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

我无法使用C++编译MPI编译器

我试图编译一个非常简单的MPI hello_world:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
    int numprocs, rank, namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Get_processor_name(processor_name, &namelen);

    printf("Process %d on %s out of %d\n", rank, processor_name, numprocs);

    MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)

并得到以下问题:

    Catastrophic error: could not set locale "" to allow processing of multibyte characters
Run Code Online (Sandbox Code Playgroud)

我真的不知道该怎么弄清楚.

c++ compiler-construction mpi

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

这段代码出了什么问题?(将char*转换为字符串)

我正在努力学习C++,并且通过这样做来学习......

这个代码的最终结果是它输出char* argv[2]一个只接受字符串作为输入的函数,它将输出一个改变的字符串.

我怎样才能转换char* argv[2]成字符串?

由于某种原因,我尝试过的所有内容都会导致命令提示符崩溃.

int main(int argc, char* argv[])
{
    std::string com2 = argv[2];
    char* com1[4];
    com1[1] = "-f";
    com1[2] = "--file";
    com1[3] = "-t";
    com1[4] = "--text";
    if (strcmp(argv[1], com1[1]) == 0) {

        cout << com2;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ string char

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

基本的提升精神语义动作不编译

我试图添加一个大于运算符>到ast:代码与文档中的代码95%相同.

下面有两个兴趣点

  • 我正在尝试编写支持大于的代码块:在下面的代码中注释.
  • 在解析单行的term该编译失败,因为我还没有理解语义动作尚未:不知道如何绑定lhslhs > rhs,通过凤和语义动作.

对于Spirit的常规用户来说,解决方案应该是微不足道的,但我仍在学习,到目前为止只能通过示例.

任何帮助,将不胜感激.TIA.

#define BOOST_SPIRIT_DEBUG

#include <boost/spirit/include/qi.hpp>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/classic_symbols.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/regex.hpp>   // std::regex not fully implemented in stdc++ yet

#include <string>
#include <map>
#include <utility>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

namespace client
{
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;

    struct binary_op;
    struct unary_op;
    struct nil …
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit result-of decltype

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