C++11 auto return 类型模板方法
C++11 auto return type in template methods
我想写一个通用函数来在不同的容器中进行搜索。
Cointainer 包含指向不同类型的共享指针。目前我有这个
template<typename TInstance, typename THandle, typename TContainer>
auto FindInContainer(TContainer& container, THandle handle) -> decltype(boost::shared_ptr<TInstance>())
{
std::lock_guard<std::mutex> lock(_mutex);
const auto& found = std::find_if(container.begin(), container.end(),
[handle](typename TContainer::value_type& instance)
{
return instance.get() == reinterpret_cast<typename TContainer::value_type::element_type*>(handle.handle);
});
if (found == container.end())
return boost::shared_ptr<TInstance>();
return *found;
}
我使用 MSVC 2015 Update 1,但不知何故它无法确定 TInstance 类型,即使我使用了指定的 return 类型(无论方法签名中 -> 运算符的术语如何).
return FindInContainer<SensorController>(_sensors, handle); // Works
return FindInContainer(_sensors, handle); // Does not compile
_sensors 定义为
std::vector<boost::shared_ptr<SensorController>> _sensors;
是我的C++生疏了,还是编译器不支持这种类型推导?
无法从函数模板的 return 类型 中推导出模板参数。只有函数模板的参数参与模板实参推导。由于 TInstance
没有包含在 FindInContainer
的任何参数中,因此无法推导出。
如果 VS 2015 更新 1 支持它,您可以对函数模板使用 return 类型推导(C++14 功能)(完全省略 return 类型):
template<typename THandle, typename TContainer>
auto FindInContainer(TContainer& container, THandle handle)
{
// ... as before
}
如果不支持,您可以求助于从容器中提取类型(就像您已经在做的那样):
template<typename THandle, typename TContainer>
typename TContainer::value_type FindInContainer(/*...*/)
{
// ... as before
}
我想写一个通用函数来在不同的容器中进行搜索。 Cointainer 包含指向不同类型的共享指针。目前我有这个
template<typename TInstance, typename THandle, typename TContainer>
auto FindInContainer(TContainer& container, THandle handle) -> decltype(boost::shared_ptr<TInstance>())
{
std::lock_guard<std::mutex> lock(_mutex);
const auto& found = std::find_if(container.begin(), container.end(),
[handle](typename TContainer::value_type& instance)
{
return instance.get() == reinterpret_cast<typename TContainer::value_type::element_type*>(handle.handle);
});
if (found == container.end())
return boost::shared_ptr<TInstance>();
return *found;
}
我使用 MSVC 2015 Update 1,但不知何故它无法确定 TInstance 类型,即使我使用了指定的 return 类型(无论方法签名中 -> 运算符的术语如何).
return FindInContainer<SensorController>(_sensors, handle); // Works
return FindInContainer(_sensors, handle); // Does not compile
_sensors 定义为
std::vector<boost::shared_ptr<SensorController>> _sensors;
是我的C++生疏了,还是编译器不支持这种类型推导?
无法从函数模板的 return 类型 中推导出模板参数。只有函数模板的参数参与模板实参推导。由于 TInstance
没有包含在 FindInContainer
的任何参数中,因此无法推导出。
如果 VS 2015 更新 1 支持它,您可以对函数模板使用 return 类型推导(C++14 功能)(完全省略 return 类型):
template<typename THandle, typename TContainer>
auto FindInContainer(TContainer& container, THandle handle)
{
// ... as before
}
如果不支持,您可以求助于从容器中提取类型(就像您已经在做的那样):
template<typename THandle, typename TContainer>
typename TContainer::value_type FindInContainer(/*...*/)
{
// ... as before
}