小编Chr*_*ula的帖子

使用语言功能(不是预处理器指令)在 C++ 中自动生成大括号括起来的初始值设定项列表

我正在寻找一种仅使用本机 C++ 语言功能(最高可达 C++17)的解决方案来完成以下任务:

std::array<Type, unsigned int Elem> array_{Type(), // 1    - Call constructor on Type()
                                           Type(), // 2    - ...
                                            ...  , // 3    - ...
                                           Type()} // Elems - Call the Elem:th Type() constructor
Run Code Online (Sandbox Code Playgroud)

此外,我还希望每个构造函数调用都应该能够接受任意数量的参数。

一个具体的例子是自动编写以下内容:

std::array<std::shared_ptr<int>, 4> array_{std::make_shared<int>(),
                                           std::make_shared<int>(),
                                           std::make_shared<int>(),
                                           std::make_shared<int>()}
Run Code Online (Sandbox Code Playgroud)

即,假设我知道 Type 和 Elem,我想自动化创建大括号括起来的初始值设定项列表的过程,并在该过程中调用 Type:s 构造函数。

有任何想法吗?

更新,我想解决的真正问题如下:

template <typename Type, unsigned int Size>
class Storage {
  public:
    Storage(std::initializer_list<Type> initializer) : array_{initializer} {}
  private:
    std::array<Type, Size> array_;
};


void foo(){
  Storage<std::shared_ptr<int>, 100> storage(...);

  // …
Run Code Online (Sandbox Code Playgroud)

c++ list-initialization braced-init-list

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

std::shared_ptr&lt;T&gt;.use_counter() 的问题

https://en.cppreference.com/w/cpp/memory/shared_ptr/use_count状态:

在多线程环境中,use_count 返回的值是近似值(典型实现使用 memory_order_relaxed 加载)

但这是否意味着use_count()在多线程环境中完全没有用呢?

考虑以下示例,其中该类Circular实现了一个循环缓冲区std::shared_ptr<int>。

向用户提供了一种方法 - ,它检查中元素get()的引用计数是否大于 1(我们不希望这样做,因为这意味着它由先前调用 的用户持有)。nextstd::array<std::shared_ptr<int>>get()

如果是<= 1,则将 的副本std::shared_ptr<int>返回给用户。

在这种情况下,用户是两个线程,除了喜欢调用get()循环缓冲区之外什么都不做——这就是他们的人生目的。

在实践中,当我执行该程序时,它会运行几个周期(通过将 a 添加counter到循环缓冲区类进行测试),然后抛出异常,抱怨下一个元素的引用计数器为> 1。

use_count()这是多线程环境下返回的值是近似值这一说法的结果吗?

是否有可能调整底层机制,使其具有确定性并按照我希望的方式运行?

如果我的想法是正确的 -在 的函数内部,元素use_count()的(或者更确切地说,用户的实际数量)next永远不应该增加到 1 以上,因为只有两个消费者,并且每次线程调用 时,它已经释放了旧的(已复制)(这又意味着剩余的驻留应该只有 1 的引用计数)。get()Circularget()std::shared_ptr<int>std::shared_ptr<int>Circular::ints_

#include <mutex>
#include <array>
#include <memory>
#include <exception>
#include <thread>

class Circular {
    public:
      Circular() {
          for …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading reference-counting shared-ptr

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