0

所以我有一个std::map< std::string, boost::any >被调用OptionsMap的函数,我想创建一个接受任何类型(因此是模板)的函数并将其存储在地图中。下一个代码会起作用吗?

template <typename T>
void Set(std::string optionName, T&& optionValue)
{
    OptionsMap[optionName] = optionValue;
}
4

2 回答 2

3

通常,当函数模板接受通用引用(即推导类型的右值引用)时,您应该对函数参数进行forward强制转换,以便获得与函数调用中的参数提供的值类别相同的值:

template <typename T>
void Set(std::string optionName, T&& optionValue)
{
    OptionsMap[optionName] = std::forward<T>(optionValue);
    //                       ^^^^^^^^^^^^^^^
}

参数变量optionValue本身始终是一个左值,因此如果没有强制转换,您将复制应该移动的内容。如果类型是可复制的,这将比预期的效率低;如果类型不可复制(例如unique_ptr),情况会更糟:您的函数现在接受一个参数,该参数随后将无法编译。

于 2014-07-20T20:50:10.070 回答
1

当然。为什么它不起作用?

boost::any::operator=接受满足ValueType的任何数据类型的参数。

boost::any当开始支持移动语义时,我只会按值移动它,以实现前向兼容性。

template <typename T>
void Set(std::string optionName, T optionValue)
{
    OptionsMap[optionName] = std::move(optionValue);
}

将右值传递给此函数在它可移动时移动它。这是由标准保证的。

于 2014-07-20T20:48:18.770 回答