小编Emi*_*ier的帖子

为什么 std::valarray 没有 std::data() 重载?

C++11std::begin(std::valarray&)以及std::end(std::valarray&).

C++17 引入了std::data()它与std::vector, std::array, C 风格的数组等一起使用。但是为什么没有为std::data()引入重载std::valarray

std::valarray被指定为具有连续存储,可以通过获取a[0](见注释)的地址来访问。

std::data(std::valarray& a)可以简单地定义为 return &(a[0])。为什么没有做到这一点?是疏忽吗?

我的动机是我正在开发一个通用的序列化库。当它从源(例如 CBOR)接收连续的二进制数数组时,它会检测目标容器是否具有重载data(container)函数、container.resize(n)成员函数以及适当的value_type(匹配原始数字类型)。这三者的存在使得memcpy()将源数据直接高效地导入目标容器成为可能。如果有std::data(std::valarray&)超载,它会让我的生活更简单。缺少它并不是一个阻碍,但它确实使代码更加混乱。


附录:我想检测一个data函数的原因是它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过std::memcpystd::copy无关紧要)。如果它不是连续的,那么我解压每次打开一个未对齐的源阵列头号和使用它附加到目标容器push_backemplace等取决于容器的类型。


附录 2:我决定使用适配器和特征方法,而不是检测data函数的存在。这将使支持非标准或用户定义的容器类型变得更加容易。我关于为什么没有std::data(std::valarray& a)仍然站的问题。


附录 3:我应该澄清一下,我需要对 CBOR 类型的数组(只能是数字)执行此操作。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。

我现在后悔提到我的动机,应该让这个std::data(std::valarray& a)问题独立存在。这个问题已经变成了一个火车事故,哈哈。:-)

c++ memcpy c++-standard-library contiguous valarray

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

是否从由Boost noncopyable派生的类派生的类中自动禁止复制?

例如:

class Foo : boost::noncopyable
{
    // ...
};

class Bar : public Foo
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

Bar不可复制的?

c++ inheritance boost noncopyable

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

什么是AutobahnJS领域?

只是想知道realmAutobahnJS 的神秘领域是什么.从文档中,创建连接如下:

var connection = new autobahn.Connection({
    url: 'ws://127.0.0.1:9000/',
    realm: 'realm1'
});
Run Code Online (Sandbox Code Playgroud)

我没有设置领域服务器端,那么这个领域参数是什么?此外,它是必需的字段,必须意味着连接工作是必要的.有人可以启发我们吗?

javascript autobahn wamp-protocol

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

如何使用构造函数设计带有std :: initializer_list的类?

当类具有构造函数重载时std::initializer_list,即使其他构造函数重载看起来更好匹配,此重载也将优先.这个问题在Sutter的GotW#1,第2部分以及Meyers的Effective Modern C++,Item 7中有详细描述.

这个问题表现出来的典型例子是大括号初始化std::vector:

std::vector<int> vec{1, 2};
// Is this a vector with elements {1, 2}, or a vector with a single element 2?
Run Code Online (Sandbox Code Playgroud)

Sutter和Meyers都建议避免类设计,其中initializer_list构造函数重载可能会给程序员带来歧义.

萨特:

准则:当你设计一个类时,避免提供一个使用initializer_list构造函数模糊地重载的构造函数,这样用户就不需要使用()来访问这样一个隐藏的构造函数.

迈尔斯:

因此,最好设计构造函数,以便调用的重载不受客户端是否使用括号或大括号的影响.换句话说,从std :: vector接口设计中的错误中学习,并设计类来避免它.

但他们都没有描述应如何 vector设计以避免这个问题!

所以这是我的问题:应该如何vector设计以避免initializer_list构造函数重载的模糊(不丢失任何功能)?

c++ vector initializer-list c++11

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

适用于STL的容器的Boilerplate typedef

在标准库或Boost中是否存在某种实用程序基类,用于使用所需的typedef(size_type,value_type等)填充自定义STL兼容的Sequence.我正在考虑像boost :: iterator_facade这样的东西,但对于容器.

我打算自己卷起来,但是想确保这样的事情还没有存在.

更新:

这是我提出的实用程序基类,以防任何人发现它有用:

template <class C>
class ContainerAdapter
{
public:
    typedef C::value_type value_type;
    typedef C::reference reference;
    typedef C::const_reference const_reference;
    typedef C::const_iterator iterator;
    typedef C::const_iterator const_iterator;
    typedef C::difference_type difference_type;
    typedef C::size_type size_type;

protected:
    typedef C::container_type;
};


// Usage
class MyCustomContainer : public ContainerAdapter< std::vector<int> >
{
...
};
Run Code Online (Sandbox Code Playgroud)

ContainerAdapter简单地"回应"自定义容器的基础容器的嵌套typedef.真的没有什么可以做的.

c++ containers boost stl boilerplate

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

将endline插入到字符串流中

我们知道,当插入\n文件流时,系统的相应行尾序列将被写入文件(例如,\r\n用于Windows).是否在std::stringstream结果中插入一个结束于系统适当的行尾序列被写入字符串?例如:

#include <sstream>

int main()
{
    std::ostringstream oss;
    oss << std::endl;
    std::string endlineSequence = oss.str();
    bool isWindows = enlineSequence == "\r\n";
    bool isOldMac  = endlineSequence == "\r";
    bool isUnix    = endlineSequence == "\n";
    // Will this work???
}
Run Code Online (Sandbox Code Playgroud)

c++ newline stringstream end-of-line

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

屈服于Boost.Asio Stackful Coroutine

使用Boost.Asio堆栈协程时,如何"手动"生成以便另一个协程或异步操作有机会运行?例如,我需要在对从TCP套接字收到的命令发送响应之前执行长计算:

asio::spawn(strand_, [this, self](asio::yield_context yield)
{
    char data[256];
    while (socket_.is_open())
    {
        size_t n = socket_.async_read_some(boost::asio::buffer(data),
                                           yield);

        if (startsWith(data, "computePi"))
        {
            while (!computationFinished)
            {
                computeSomeMore();
                yield; // WHAT SHOULD THIS LINE BE?
            }

            storeResultIn(data);
            boost::asio::async_write(socket_, boost::asio::buffer(data, n),
                                     yield);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

c++ boost coroutine boost-asio c++11

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

小 N 的 std::map 与 unordered_map 内存占用

对于内存使用比速度更重要的嵌入式系统应用程序,最好使用什么地图容器?std::map, std::unordered_map? 这适用于N小于例如一百的情况。

如果实现很重要,那么我关心的是 libstdc++ 实现(GCC)。

虽然我知道不可能在内存使用方面击败简单的数组,但我想避免使用具有 O(N) 性能的数据结构。因此,虽然我想减少内存占用,但我也希望查找速度合理(优于 O(N))。我不关心其他操作(插入、删除),因为它们很少发生。

如果我想进行自己的内存使用测量,我将如何在 Linux 平台上执行此操作?

提振:: flat_map适合作为具有占地面积小和查找时间比O(n)的关联容器?

c++ optimization gcc dictionary c++11

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

默认函数参数的有效表达式

函数或成员函数中的默认参数的所有可能类型的有效表达式是什么?

c++ c++-faq

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

我可以在XCode 4.3.2中禁用"从GDB升级调试器到LLDB"警告吗?

我不想对Apple的LLDB调试器进行beta测试.如何让XCode停止唠叨我升级调试器?每次我建立这个警告惊叹号都是相当恼人的.

iphone xcode ios xcode4 lldb

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