【发布时间】:2021-04-19 21:31:07
【问题描述】:
我正试图围绕可变参数模板进行思考, 移动语义,(也许是完美的转发?), 并学习如何将变量传递给不同的函数。
比方说,有一个类 Foo 包含一个 Elem(模板化)类实例的数组。 这些数组元素会定期重新初始化(因此是 Elem.init 函数)。
下面我试图用三个大字符串(或任何其他实现移动语义的大对象)初始化一个 Elem 到它们将被存储的确切位置: 在Foo的数组中,在某个位置。
是否可以立即将它们移动到 Foo 的矢量位置? 还是会一直是“复制语义”而不是移动。
总的来说,我试图避免复制大的堆栈分配字符串,并以某种方式让它们位于目标向量的位置。 不知道最好的方法是什么。
(我现在得到的只是一个分段错误)
感谢您的阅读! 在线代码如下:https://onlinegdb.com/HJc7U_jIO
#include <iostream>
#include <vector>
#include <string>
class Elem
{
public:
void init(std::string&& s1, std::string&& s2, std::string&& s3)
{
s1 = std::move(s1);
s2 = std::move(s2);
s3 = std::move(s3);
std::cout << mS1 << mS2 << mS3;
}
private:
std::string mS1;
std::string mS2;
std::string mS3;
};
template <class T>
class Foo
{
public:
template <typename... Args>
void add(Args... args)
{
mElements[mNextFreeIndex].init(args...);
mNextFreeIndex++;
}
private:
std::vector<T> mElements;
int mNextFreeIndex;
};
int main()
{
Foo<Elem> foo;
foo.add(std::move("Apple"), std::move("Pear"), std::move("Carrot")); //passing 3 parameters
return 0;
}
【问题讨论】:
标签: c++11 variadic-templates move-semantics