gpt4 book ai didi

c++ - 在使用聚合初始化时是否可以在 map 中执行 no-copy emplace?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:43 26 4
gpt4 key购买 nike

有关如何插入 的信息,请参阅此答案无需复制 map 值。

std::map emplace without copying value

从那个答案继续 - 假设我的 Foo 类型看起来像这样:

struct Foo {
const int& intref_;
std::mutex mutex_;
}

然后像这样使用聚合初始化进行初始化

Foo{7}

Foo{7, std::mutex()}

是否有可能以某种方式放置到具有类型的 map 中?:

std::map<size_t, Foo> mymap;

我知道我可以只为 Foo 编写一个构造函数 - 但它可以通过聚合初始化来完成吗?

编译器资源管理器链接:

https://godbolt.org/z/_Fm4k1

相关c++引用资料:

https://en.cppreference.com/w/cpp/container/map/try_emplace

https://en.cppreference.com/w/cpp/language/aggregate_initialization

最佳答案

您可以 exploit casts间接你的 build

template<typename T>
struct tag { using type = T; };

template<typename F>
struct initializer
{
F f;
template<typename T>
operator T() &&
{
return std::forward<F>(f)(tag<T>{});
}
};

template<typename F>
initializer(F&&) -> initializer<F>;

template<typename... Args>
auto initpack(Args&&... args)
{
return initializer{[&](auto t) {
using Ret = typename decltype(t)::type;
return Ret{std::forward<Args>(args)...};
}};
}

并将其用作

struct Foo
{
const int& intref_;
std::mutex mutex_;
};

void foo()
{
int i = 42;
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(0),
std::forward_as_tuple(initpack(i)));
}

请注意,您无法通过将临时文件绑定(bind)到非堆栈引用来延长临时文件的生命周期。

关于c++ - 在使用聚合初始化时是否可以在 map 中执行 no-copy emplace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54980297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com