在插入时插入std :: MAP中的模板类
Insert templated class in std::map with construction at insertion
我正在尝试插入一个模板类的实例,该类别没有复制构造函数。下面的代码不起作用,因为在emplace
功能上,编译器要调用复制构造函数。我不明白为什么,因为我从c 参考中理解了emplace不会移动或复制:
仔细使用EMPLECE可以构建新元素 避免不必要的副本或移动操作。
这是我的代码:
#include <map>
#include <string>
template<typename T> class Class_a
{
public:
Class_a(T t1, T t2) : t1_(t1), t2_(t2) {}
~Class_a() {}
Class_a(const Class_a&) = delete;
Class_a& operator=(const Class_a&) = delete;
Class_a(Class_a&&) = delete;
private:
const T t1_;
const T t2_;
};
template<typename T>
using Class_a_map = std::map<std::string, Class_a<T>>;
int main()
{
Class_a_map<double> class_a_map;
std::string name = "test";
double number1 = 42;
double number2 = 43;
class_a_map.emplace(name, Class_a<double>(number1, number2));
return 0;
}
您可以使用std::piecewise_construct
和std::forward_as_tuple
来创建对象。
class_a_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(name),
std::forward_as_tuple(number1, number2)
);
live wandbox示例
std::map::emplace
完美地将一堆参数转发到用于键/值存储的基础std::pair
。std::pair::pair
的过载将std::piecewise_construct_t
作为其第一个参数,然后将两个std::tuple
实例用于:第一个实例将用于构造.first
,第二个将用于构造.second
。
来自cppreference,涉及std::pair
的分段构造函数:
将
first_args
的元素转发到first
的构造函数,并将second_args
的元素转发到second
的构造函数。这是唯一可用于创建一对不可移动类型的非默认构造函数。
相关文章:
- 将重物插入std::map
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 找不到最新插入到 std::map 中的键
- 在 std::map 中插入数组元素
- 插入 std::set 作为 std::map 的键
- 通过构造函数插入 std::map
- 将带有模板的自定义类插入到 std::map 中
- std::map 索引运算符与插入方法的性能
- 尝试在 std::map 中插入抽象类时没有用于调用的匹配函数
- 如何在声明时将对象插入 std::map
- 如何在 std::map<const int、int> C++ 中重载插入运算符>>?
- 在 std::map 中插入对象时构造函数中变量的地址
- 在这种情况下,插入 std::map 可能会失败?
- 从元组向 std::map 插入值
- 如何在 C++11 中插入 std::map?
- std::map::emplace无法解决,但插入右值有效 - 为什么?
- C++ 堆栈中的类对象作为 Map 的值插入
- 查找并插入-STD :: MAP C
- 将项目插入到std :: map时错误
- 将列表初始化的对插入到 std::map 中