有关如何在不复制映射值的情况下插入到stdmap中,请参见此答案。
从这个答案继续--假设我的Foo类型如下所示:
struct Foo {
const int& intref_;
std::mutex mutex_;
}然后使用聚合初始化进行初始化,如下所示
Foo{7}或
Foo{7, std::mutex()}是否有可能以某种方式将其放置在地图上?
std::map<size_t, Foo> mymap;我知道我可以为Foo编写一个构造函数--但是它能用聚合初始化来完成吗?
链接到编译器资源管理器:
相关c++参考文献:
发布于 2019-03-04 11:24:12
你可以用利用铸型间接构造
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)));
}注意,不能通过将临时的生存期绑定到非堆栈引用来延长其生存期。
发布于 2019-03-04 12:10:55
这并不是std::map::try_emplace的问题,也不是std::pair的问题。由于这个简单的声明将重现一个根源于同一问题的错误:
std::pair<const int, Foo> p(
std::piecewise_construct,
std::forward_as_tuple(0),
std::forward_as_tuple(i)
);这并不是std::pair本身的问题。作为n4462细节的抽象,它非常普遍。简单地说,这对c‘’tor(和许多库函数一样)的转发如下:
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)因此没有大括号,因此没有聚合初始化,只有值初始化。您今天唯一的选择是定义一个实际的C‘’tor,或者使用类似于Passer By's 聪明的解决方案之类的东西。
在飞行中有一篇论文(p0960),目的是在未来的标准修订中解决这个问题,但只有时间才能说明它将如何发展。
https://stackoverflow.com/questions/54980297
复制相似问题