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
}