【发布时间】:2017-12-18 20:35:50
【问题描述】:
我正在尝试在对象中实现“安放”功能。它的结构如下。我有一个将 size_t 与模板类型配对的模板对象。我希望能够在标准库容器中构建它,例如向量。我没有使用std::pair,因为我的班级B 将围绕数据提供其他功能。
我需要如何修改代码,以便可以像在 main 中一样调用 emplace?
#include <iostream>
#include <vector>
using namespace std;
class C {
public:
C(const string& _s) : s(_s) {}
C(string&& _s) : s(_s) {}
private:
string s;
};
template<typename A>
class B {
public:
B(size_t _i, const A& _a) : i(_i), a(_a) {}
B(size_t _i, A&& _a) : i(_i), a(_a) {}
private:
size_t i;
A a;
};
int main() {
vector<B<C>> v;
v.emplace_back(5, "Hello");
}
【问题讨论】:
-
v.emplace_back(5, C("Hello")) -
@0x499602D2 这不会在向量中调用额外的 C 副本吗?我希望避免这种情况,并为我的班级提供漂亮的语法
-
字符串
"Hello"需要转换为C。如果不创建一个临时的C("Hello")对象,这是不可能发生的。不会发生副本,因为它绑定到右值引用_a。实际复制发生在a(_a),即使没有制作临时副本也会发生。 -
@0x499602D2 啊,我明白了。至于追求所需的语法,有什么可能的解决方法吗?
-
v.emplace_back(5, std::string{"Hello"}) ? (也许在移动构造函数中有一些
std::move()?)
标签: c++ templates c++14 emplace