模板方法中的C ++ 11自动返回类型

时间:2015-12-14 08:20:49

标签: c++ c++11 templates auto

我想编写一个通用函数来搜索不同的容器。 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 ++是否生锈,或者编译器不支持此类型扣除?

1 个答案:

答案 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
}