我想编写一个通用函数来搜索不同的容器。 Cointainers包含指向不同类型的共享指针。目前我有这个
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类型,即使我使用了指定的返回类型(无论方法签名中的&gt;运算符是什么术语)。
return FindInContainer<SensorController>(_sensors, handle); // Works
return FindInContainer(_sensors, handle); // Does not compile
_sensors定义为
std::vector<boost::shared_ptr<SensorController>> _sensors;
我的C ++是否生锈,或者编译器不支持此类型扣除?
答案 0 :(得分:2)
无法从函数模板的返回类型推断出模板参数。只有函数模板的参数参与模板参数推导。由于TInstance
未列入FindInContainer
的任何参数,因此无法推断出。
如果VS 2015 Update 1支持它,您可以对函数模板使用返回类型推导(C ++ 14特性)(完全省略返回类型):
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
}