小编ken*_*nba的帖子

如何最好地在 C++ 中实现“newtype”习语?

自从学习 Rust 以来,我已经成为我收集 Rust从 Haskell借来的新型习语的粉丝。

新类型是基于标准类型的独特类型,可确保函数参数的类型正确。
例如,old_enough下面的函数必须以年为单位传递年龄。它不会以天数或普通 i64 为单位编译。

struct Days(i64);
struct Years(i64);

fn old_enough(age: &Years) -> bool {
    age.0 >= 18
}
Run Code Online (Sandbox Code Playgroud)

这与C++ 中的typedeforusing声明不同,它只是重命名类型。
例如,old_enough下面的函数将接受 an int、age inDays或任何其他转换为 an 的内容int

typedef int Days;
using Years = int;

bool old_enough(Years age) {
    return age >= 18;
}
Run Code Online (Sandbox Code Playgroud)

由于上面的示例仅使用整数,因此Reddit 上的这篇文章建议使用枚举类,例如:

enum class Days : int {};
enum class Years : …
Run Code Online (Sandbox Code Playgroud)

c++ newtype

31
推荐指数
2
解决办法
2111
查看次数

Boost :: ASIO:针对最小流量,长连接,小消息进行优化,立即传递

我正在Boost :: ASIO中编写一个协议,它具有以下要求:

  1. 连接是持久的,并且应尽可能使用最小的开销来"保持活力".
  2. 消息很小,需要立即传递.

是否应该使用其他TCP套接字标志或Boost :: ASIO设置?

socket_.set_option(boost::asio::ip::tcp::no_delay(true));   // enable PSH
socket_.set_option(boost::asio::socket_base::keep_alive(true)); // enable SO_KEEPALIVE
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPIDLE>(120)); // secs before keepalive probes
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPINTVL>(10)); // interval between keepalive
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPCNT(5)); // failed keepalive before declaring dead
Run Code Online (Sandbox Code Playgroud)

c++ sockets boost tcp boost-asio

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

安全断开asio SSL插槽的正确方法是什么?

一个boost-asioSSL/TLS TCP套接字实现为ssl::streamtcp::socket:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
Run Code Online (Sandbox Code Playgroud)

TLS协议中,加密安全关闭涉及各方交换close_notify消息.简单地关闭最低层可能会使会话容易受到截断攻击.

提升asio ssl async_shutdown总是以错误结束?@Tanner Sansbury在很多场景中详细描述了SSL关闭过程,并建议在关闭套接字之前使用a async_shutdown后跟a async_write断开SSL流:

ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); }) 
Run Code Online (Sandbox Code Playgroud)

执行async_shutdownon on ssl::stream发送SSL close_notify消息并等待来自另一端的响应.async_shutdownasync_shutdown发送之后将被通知的目的是写入流,close_notify以便可以在不等待响应的情况下关闭套接字.但是,在当前(1.59)版本的boost中,调用async_write失败...

如何优雅地关闭提升asio ssl客户端?@maxschlepzig建议关闭底层TCP套接字的接收者:

ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
Run Code Online (Sandbox Code Playgroud)

这会产生short read错误,并async_shutdown在错误处理程序中检测到时调用:

// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
  ec.value()    == ERR_PACK(ERR_LIB_SSL, …
Run Code Online (Sandbox Code Playgroud)

c++ ssl boost-asio

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

使用c ++ boost asio进行UDP通信

我需要通过UDP与专用网络中的其他设备进行通信.我是使用boost的新手,但根据我在网上搜索的内容以及Boost网站上的教程,我提出了以下代码..我目前正在尝试从我自己的设备发送和接收数据.只是为了进行单元测试并最终确定代码.

问题:我无法收到任何消息.我错过了什么?

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include "boost/asio.hpp"
#include <thread>
#include <boost/array.hpp>
#include <boost/bind.hpp>

#define SRVR_UDP_PORT  10251
#define CLNT_UDP_PORT 10252

boost::array<char, 1024> recv_buffer;

void Sender(std::string in)
{
    boost::asio::io_service io_service;
    boost::asio::ip::udp::socket socket(io_service);
    boost::asio::ip::udp::endpoint remote_endpoint;
    socket.open(boost::asio::ip::udp::v4());
    remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string("192.168.1.64"), SRVR_UDP_PORT);

    boost::system::error_code err;
    socket.send_to(boost::asio::buffer(in.c_str(), in.size()), remote_endpoint, 0, err);
    socket.close();
    //int i =0;
    printf("Sending Payload --- \n");
}

void handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
    std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
}


void Receiver()
{
    while(1)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ sockets boost udp boost-asio

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

为什么boost :: geometry地理Vincenty距离在赤道附近不正确?

我需要一个函数来高精度地计算一对WGS 84位置之间的距离,并且我打算使用Boost几何中geographic函数。

升压几何设计合理的状态:

有Andoyer方法,既快速又精确,还有Vincenty方法,又慢又精确。

但是,在boost::geometry::distance同时使用AndoyerVincenty策略测试功能时,我得到了以下结果:

WGS 84 values (metres)
    Semimajor axis:         6378137.000000
    Flattening:             0.003353
    Semiminor axis:         6356752.314245

    Semimajor distance:     20037508.342789
    Semiminor distance:     19970326.371123

Boost geometry near poles
Andoyer function:
    Semimajor distance:     20037508.151445
    Semiminor distance:     20003917.164970
Vincenty function:
    Semimajor distance:     **19970326.180419**
    Semiminor distance:     20003931.266635

Boost geometry at poles
Andoyer function:
    Semimajor distance:     0.000000
    Semiminor distance:     0.000000
Vincenty function:
    Semimajor distance:     **19970326.371122**
    Semiminor distance:     20003931.458623
Run Code Online (Sandbox Code Playgroud)

Vincenty沿半长轴(即在赤道附近)距离小于周围的短半轴的距离北极和南极之间的轴。那是不正确的。 …

c++ gis wgs84 boost boost-geometry

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

对浮点数求和的最佳 OpenCL 2 内核是什么?

C++ 17 引入了许多新算法来支持并行执行,特别是std::reduce是std::accumulate的并行版本,它允许浮点加法等操作non-deterministic的行为。non-commutative我想使用 OpenCL 2 实现一个归约算法。

Intel这里有一个示例,它使用 OpenCL 2work group内核函数来实现std::exclusive_scan OpenCL 2 内核。以下是基于英特尔exclusive_scan示例的内核求和浮点数:

kernel void sum_float (global float* sum, global float* values)
{
  float sum_val = 0.0f;

  for (size_t i = 0u; i < get_num_groups(0); ++i)
  {
    size_t index = get_local_id(0) + i * get_enqueued_local_size(0);
    float value = work_group_reduce_add(values[index]);
    sum_val += work_group_broadcast(value, 0u);
  }

  sum[0] = sum_val;
}
Run Code Online (Sandbox Code Playgroud)

上面的内核可以工作(或者看起来可以!)。然而,exclusive_scan要求work_group_broadcast函数将最后一个值 1 传递work …

c++ gpgpu opencl c++17 sycl

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

在Windows 7上将升级日志1_60与MinGw链接的问题

在升级到升级1.60.0时,某些应用程序在Windows 7上使用MinGw 4.9.2构建时无法与升级日志链接.

我收到以下链接器错误:

undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux15stream_providerIcE17allocate_compoundERNS1_6recordE'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux25unhandled_exception_countEv'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt611record_view11public_data7destroyEPKS3_'
bad reloc address 0x1 in section `.text$_ZNK5boost4asio5error6detail13misc_category4nameEv[__ZNK5boost4asio5error6detail13misc_category4nameEv]'
Run Code Online (Sandbox Code Playgroud)

注意:BOOST_LOG_DYN_LINK定义为:

g++ -c -pipe -fno-keep-inline-dllexport -Wall -Wextra -Wpedantic -Ofast -std=c++1y -frtti -fexceptions -mthreads -DUNICODE -DLOGGING_ENABLED -DNTDDI_VERSION=NTDDI_WIN7 -D_WIN32_WINNT=_WIN32_WINNT_WIN7 -DBOOST_THREAD_USE_LIB=1 -DBOOST_LOG_DYN_LINK=1
Run Code Online (Sandbox Code Playgroud)

boost 1.60.0构建日志文件显示boost log和boost log_setup都没有任何错误或警告,包括一些无法链接的文件,例如:

gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\trivial.o
gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\unhandled_exception_count.o   
Run Code Online (Sandbox Code Playgroud)

应用程序在Windows 7上使用boost 1.59.0和MinGw 4.9.2链接正常,并在Fedora 23上使用boost 1.60.0和gcc 5.1.1链接OK.

自从提升1.58.0以来,提升asio没有改变.那么在boost 1.59.0和boost 1.60.0之间的boost日志中有什么变化导致MinGw链接在Windows上失败?

windows gcc boost boost-log

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

在单独的 cpp 文件中进行 Boost 单元测试

我想将 Boost 单元测试分成单独的 .cpp 文件(例如 Test1.cpp、Test2.cpp、Test3.cpp ...等),这样我就不会在单个 cpp 文件中包含 1000 个测试。到目前为止,当我尝试构建时,我遇到了各种错误。

测试1.cpp

#define BOOST_TEST_MODULE MasterTestSuite
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(myTestCase)
{
  BOOST_CHECK(1 == 1);  
}
Run Code Online (Sandbox Code Playgroud)

测试2.cpp

#define BOOST_TEST_MODULE MasterTestSuite2
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(myTestCase2)
{
  BOOST_CHECK(2 == 2);  
}
Run Code Online (Sandbox Code Playgroud)

c++ boost unit-testing boost-test

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

Boost SSL验证过期和自签名证书

我正在使用Boost的asio通过HTTPS连接到网站.我希望这只有在证书有效,没有过期,没有自签名等情况下才能成功.不幸的是,似乎无论如何总是有效.这是我的代码:

try
{
    asio::io_service ioService;
    asio::ssl::context sslContext(asio::ssl::context::sslv3_client);

    sslContext.load_verify_file("cacert.pem");

    asio::ip::tcp::resolver resolver(ioService);
    asio::ip::tcp::resolver::query query("self-signed.badssl.com", "443");
    asio::ip::tcp::resolver::iterator endpointIterator = resolver.resolve(query);

    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(ioService, sslContext);

    ioService.run();

    // Enable SSL peer verification.
    socket.set_verify_mode(asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert);

    asio::connect(socket.lowest_layer(), endpointIterator);

    socket.handshake(asio::ssl::stream_base::client);

    boost::asio::streambuf request;
    std::ostream requestStream(&request);
    requestStream << "GET / HTTP/1.0\r\n";
    requestStream << "Host: self-signed.badssl.com\r\n";
    requestStream << "Accept: */*\r\n";
    requestStream << "Connection: close\r\n\r\n";

    asio::write(socket, request);
Run Code Online (Sandbox Code Playgroud)

等等.如果我使用set_verify_callback()false从回调中返回,连接确实会失败,但preverified似乎总是如此,即使对于https://self-signed.badssl.com/也是如此.当然那不对?

ssl boost openssl ssl-certificate boost-asio

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

Fedora 中 boost 的使用

我真的很想开始使用 boost 库,但我在“安装”它时遇到了麻烦。

我希望能够通过以下方式访问该功能

#include <boost/signals2/signal.hpp>
Run Code Online (Sandbox Code Playgroud)

然后 g++ 文件名.cpp。

而不必写

#include "boost/signals2/signal.hpp"
Run Code Online (Sandbox Code Playgroud)

并在我的本地目录中有大量的 boost 。

有没有一种方法可以设置升压以使其起作用?我已经下载了 boost 库并将其解压到 /usr/local。

c++ boost fedora

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