按需创建副本
Create a copy on demand
是否有一种惯用的方法来调用表达式中副本的创建?
例如,我有一个函数声明为:
template <class T>
void foo(T&& arg)
{
}
现在我需要用我的对象的副本调用 foo
:
MyType object;
foo(object);
如上所述,我将调用 void foo(MyType& arg)
,但是 我不想传递对我的对象的引用 。我还想避免从我的对象移动以触发 void foo(MyType&& arg)
.
的推论
我想要做的是 在 foo
的调用站点创建 object
的副本:
foo(copy(object));
我试过以下方法:
- 自己创建一个
copy
函数,生成对象:template <class T> T copy(T arg) { return arg; }
- 通过正向转换复制:
foo(std::forward<MyObject>(object))
,但不要认为它适用于通用代码
- 通过创建传递给 foo 的局部变量显式复制:
MyType copy(object); foo(std::move(copy));
是否有标准的图书馆设施或“普遍接受”的方式来做到这一点?
编辑:
如评论中所述,foo(MyType(object))
始终是一个解决方案。我在问是否有惯用的方法,因为 通常在这种情况下拼出类型可能不太安全:
// Converting constructors may create spurious problems:
foo(AnotherType(object));
// This can compile even if decltype(object) != AnotherType
而无需注意指定类型的解决方案始终是安全的:
foo(copy(object));
是否有一种惯用的方法来调用表达式中副本的创建?
例如,我有一个函数声明为:
template <class T>
void foo(T&& arg)
{
}
现在我需要用我的对象的副本调用 foo
:
MyType object;
foo(object);
如上所述,我将调用 void foo(MyType& arg)
,但是 我不想传递对我的对象的引用 。我还想避免从我的对象移动以触发 void foo(MyType&& arg)
.
我想要做的是 在 foo
的调用站点创建 object
的副本:
foo(copy(object));
我试过以下方法:
- 自己创建一个
copy
函数,生成对象:template <class T> T copy(T arg) { return arg; }
- 通过正向转换复制:
foo(std::forward<MyObject>(object))
,但不要认为它适用于通用代码 - 通过创建传递给 foo 的局部变量显式复制:
MyType copy(object); foo(std::move(copy));
是否有标准的图书馆设施或“普遍接受”的方式来做到这一点?
编辑:
如评论中所述,foo(MyType(object))
始终是一个解决方案。我在问是否有惯用的方法,因为 通常在这种情况下拼出类型可能不太安全:
// Converting constructors may create spurious problems:
foo(AnotherType(object));
// This can compile even if decltype(object) != AnotherType
而无需注意指定类型的解决方案始终是安全的:
foo(copy(object));