所以我有一个名为std::map< std::string, boost::any >
的{{1}},我想创建一个接受任何类型(因此是模板)的函数并将其存储在地图中。
下一个代码会起作用吗?
OptionsMap
答案 0 :(得分:3)
通常,当函数模板接受通用引用(即推导类型的右值引用)时,应该使用forward
转换函数参数,以便获得与提供的值相同的值类别通过函数调用中的参数:
template <typename T>
void Set(std::string optionName, T&& optionValue)
{
OptionsMap[optionName] = std::forward<T>(optionValue);
// ^^^^^^^^^^^^^^^
}
参数变量optionValue
本身始终是一个左值,因此如果没有强制转换,您将复制应该移动的内容。如果类型是可复制的,那么效率将低于预期;如果类型不可复制(例如unique_ptr
),那就更糟了:你的函数现在接受一个参数,它随后将无法编译。
答案 1 :(得分:1)
当然。为什么它不起作用?
boost::any::operator=
接受满足ValueType的任何数据类型的参数。
当boost::any
开始支持移动语义时,我只需按值移动它,以获得向前兼容性。
template <typename T>
void Set(std::string optionName, T optionValue)
{
OptionsMap[optionName] = std::move(optionValue);
}
将rvalue传递给此函数会在可移动时将其移动。这是由标准保证的。