小编Dev*_*ull的帖子

boost::combine,基于范围的和结构化绑定

有没有一种方法可以boost::combine使用结构化绑定和基于范围的 for(这样结构绑定中的标识符实际上指向容器的元素,而不是内部使用的嵌套元组boost::combine)?以下(实时示例)无法编译:

#include <boost/range/combine.hpp>
#include <iostream>

int main()
{
    std::vector<int> a{1,2,3};
    std::vector<int> b{2,3,4};

    for (auto [f, s] : boost::combine(a, b))
    {
        std::cout << f << ' ' << s << std::endl   
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ boost for-loop c++17

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

如何使用不同类型的键搜索std :: map

如果我有std::map<X, Blah>,使用实例查找地图中匹配项目的最佳方法是Y什么?

假设信息Y足以唯一地找到X,但出于性能原因,我不想X通过复制Y值来创建实例.

我知道我可以创建一个公共基类或接口做到这一点X,并Y和制作该地图的关键,但有没有其他办法?例如,创建某种比较对象?

以下是示例代码:

class X
{
public:
    int id;
    int subId;
};

std::map<X, Details> detailsMap;

class Y
{
public:
    int getId();
    int getSubId();
    int someOtherUnrelatedThings1;
    int someOtherUnrelatedThings2;
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我有一个实例Y,原则上我应该能够在我的地图中找到匹配的项目,因为我可以得到一个idsubId一对.但我能做到这一点,而无需创建的实例X在和复制idsubId

c++ performance dictionary stl comparator

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

推断容器和initializer_list-s的模板函数

我想编写一个辅助函数,如:

template <typename F, typename Range1, typename Range2>
auto helper(const Range1& left, const Range2& right, F&& pred)
{
    using namespace std; // for cbegin/cend and ADL
    return pred(cbegin(left), cend(left), cbegin(right), cend(right));
}
Run Code Online (Sandbox Code Playgroud)

它适用于容器:

std::vector<int> v1 = {1,2,3,4,5,6};
std::vector<int> v2 = {5,4,3,2,1,6};

std::cout << helper(v1, v2, [](const auto&... args){ return std::is_permutation(args...);}) << std::endl;
Run Code Online (Sandbox Code Playgroud)

但它没有推断initializer_list--s(例子):

std::cout << helper({1,2,3,4,5,6}, {5,4,3,2,1,6}, [](const auto&... args){ return std::is_permutation(args...);}) << std::endl;
Run Code Online (Sandbox Code Playgroud)

是否有一种惯用的重写方式,helper以便它推导出容器和initializer_list-s?

对于容器和容器的所有组合,initializer_list我无法想出任何比重更好的东西.

c++ templates initializer-list c++14 c++17

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

为什么gcc警告用std :: tuple和虚拟继承调用一个非平凡的移动赋值运算符?

在以下示例中,gcc 7发出警告:

"B"的默认移动分配称为虚拟基础'A'的非平凡移动赋值运算符[-Wvirtual-move-assign]

如果我创建一个std::tuple<B>对象.Clang 5没有报告任何问题.如果vector被删除,问题就会消失Base.例子.

#include <tuple>
#include <vector>

class Base
{
public:
    virtual ~Base();
    std::vector<int> v;
};

class A : public Base
{
};

class B : public virtual A
{
};

int main()
{
    B *b = new B;
    B another{*b}; // <<<--- this compiles
    std::tuple<B> t; // <<<--- gives warning
}
Run Code Online (Sandbox Code Playgroud)

为什么会出现std::tuple(并且没有移动分配),如果我需要保持这样的层次结构,那么解决它的正确方法是什么?

c++ gcc clang c++14

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

python raw socket:不支持协议

我试图在linux下用Python打开一个原始套接字.

我的简单代码:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 5454))
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

[ERROR] Protocol not supported
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在linux 12.04下使用python 2.7.3,我用root来运行代码.

有人有线索吗?

更新:我的灵魂,dstromberg给出的解决方案是正确的.如果您想要所有数据包,请使用他的解决方案.但是,还有另一种组合,

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
Run Code Online (Sandbox Code Playgroud)

也有效.

在这种情况下,您将收到所有带有IP和TCP标头的TCP数据包.如果您使用dstromberg的解决方案,您还将看到以太网标头.所以它取决于你想要你的数据包的'原始'~~

python sockets linux

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

如何在std :: pair中返回std :: lock_guard

当我从函数中返回a时std::lock_guard,std::pair我会得到可怕的错误.但是当我将它打包成一个类时,我没有任何问题(编译并按预期工作).我不明白为什么.细节如下:

我设计了一个小模板类,以便方便地锁定和解锁共享对象.它不是特别创新,但C++ 17允许它非常紧凑并且代码读/写友好:

template <typename T> class Locked {
public:
    Locked(T& _object, std::mutex& _mutex)
        : object(_object)
        , lock(_mutex)
    {
    }

    T&                          object;
    std::lock_guard<std::mutex> lock;
};

template <typename T> class Lockable {
public:
    Locked<T>       borrow() { return Locked(object, mutex); }
    Locked<const T> borrow() const { return Locked(object, mutex); }

private:
    T                  object;
    mutable std::mutex mutex;
};
Run Code Online (Sandbox Code Playgroud)

它可以像:

int main()
{
    Lockable<std::vector<int>> lv;

    auto [vec, lock] = lv.borrow();

    std::cout << vec.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.这Locked堂课很瘦.我以为我可以使用std::pair …

c++ c++17

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

如何定义在两个类之外的模板类内部的非模板类中声明的友元函数?

我发现"如何在其声明之外定义模板类的朋友模板函数"(SO/cppreference),但是如果我们在混合中添加另一个内部非模板类,该怎么做呢?

即如何(外部)定义operator<<声明的in class Internal以下示例:

#include <iostream>

template <typename T>
class External {
public:
    explicit External(T initial) : value{initial} {}
    class Internal {
    public:
        Internal(const External& e) : internal_value{e.value} {}

    private:        
        friend std::ostream& operator<<(std::ostream& os, const Internal& i);
        // ^^^ this one
        /* body
        {
            return os << i.internal_value;
        }
        */

        T internal_value;
    };

    friend std::ostream& operator<<(std::ostream& os, const External& e)
    {
        return os << Internal{e};
    }
private:
    T value;
};

int main()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates friend inner-classes c++11

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

如何获取可变参数宏中每个参数的名称?

可以创建一个str(a)将使用其argument(a)及其字符串化名称(#a)的宏,例如:

#include <iostream>

#define str(a) #a, " ", a

int main()
{
    int i = 5;
    float f = 4.5;
    const char* s = "string";

    auto l = [] (const auto&... p) { (std::cout << ... << p) << std::endl; };

    l(str(i));
    l(str(f));
    l(str(s));
}
Run Code Online (Sandbox Code Playgroud)

例子.

是否有一种简单的方法来打印带有每个参数名称的可变数量的参数?即PREPEND_EACH_ARG_WITH_HASH_ARG从以下实施:

#include <iostream>
#include <tuple>

template <typename ... Ts>
void print_all(const Ts&... ts)
{
    (std::cout << ... << ts) << std::endl;
}

#define …
Run Code Online (Sandbox Code Playgroud)

c++ macros c++14 c++17

6
推荐指数
2
解决办法
758
查看次数

为什么gcc会警告有关大量alignas值?

使用gcc 6.3编译时,此示例程序

#include <array>

class alignas(4096) A {
    std::array<int, 256> array;
};

int main()
{
    A a;
}
Run Code Online (Sandbox Code Playgroud)

给出以下警告:

3 : <source>:3:21: warning: requested alignment 4096 is larger than 128 [-Wattributes]
 class alignas(4096) A {
                     ^
Run Code Online (Sandbox Code Playgroud)

但是,gcc 7.2没有这种错误。

  1. 这是否意味着编译器仅通知对齐太大?这样的警告的目的是什么?
  2. 该标准不允许编译器忽略此对齐说明符(即使存在警告),是吗?

c++ c++14

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

std :: vector :: assign/std :: vector :: operator =(const&)是否保证在`this`中重用缓冲区?

如果我将一个向量分配或复制到另一个向量(具有与前者相同或更大的容量),我可以假设后者的缓冲区将被重用吗?

以下示例说明我可以通过标准保证吗?这方面的行为std::vector::assignstd::vector::operator=这方面有什么区别吗?

#include <vector>
#include <iostream>
#include <cassert>

int main()
{
    std::vector a {1, 2, 3, 4, 5};
    std::vector b {1, 2, 3, 4};
    std::vector c {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::cout << "1 ==== " << a.capacity() << " " << a.data() << std::endl;

    const auto* pa = a.data();   
    a = b;
    assert(pa == a.data());
    std::cout << "2 ==== " << a.capacity() << " " << a.data() << std::endl;

    a …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++14 c++17

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