我正在尝试在对象中实现“放置”功能。它的结构如下。我有一个将 size_t 与模板类型配对的模板对象。我希望能够在标准库容器(例如 vector )中就地构建它。我没有使用 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");
}
最佳答案
每个参数允许一个用户定义的转换序列,并且您有两个:
const char*
-->std::string
std::string
-->C
您可以做的是通过实现通用转发构造函数来减少隐式转换的数量:
template<typename A>
class B {
public:
template<typename X>
B(size_t _i, X&& _a) : i(_i), a(std::forward<X>(_a)) {}
...
};
这将生成一个构造函数 B(size_t, const char*)
,它将与 emplace_back(5, "Hello")
完美匹配,只需一次转换即可构造a
来自 const char *
。
关于c++ - 放置复杂物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876018/