元组查找函数参数替换失败

时间:2017-01-13 15:47:18

标签: c++ c++11 templates tuples

所以,我在休息一段时间后回到C ++,我想也许我应该写一些有趣的东西。在这里我想到了在元组的容器中搜索的函数,如果元组的第N个元素满足要求(值或一元函数),则返回迭代器。

所以,这就是我现在写的:

template<std::size_t tupleIndex,
         template<typename...> class Container,
         template<typename...> class Tuple,
         typename... TupleArgs>
auto find(typename Container<Tuple<TupleArgs...>>::iterator it1,
          typename Container<Tuple<TupleArgs...>>::iterator it2,
          decltype(std::get<tupleIndex>(std::declval<Tuple<TupleArgs...>>())) searchedValue) {
    for(; it1 != it2; ++it1) {
        if(std::get<tupleIndex>(*it1) == searchedValue)
            break;
    }
    return it1;
} 

但它未能通电:

using Tuple = std::tuple<int, float, bool>;
std::vector<Tuple> vec{std::make_tuple(1, 1.5, false),
                       std::make_tuple(2, 2.5, true),
                       std::make_tuple(3, 3.5, false)};

auto iter = find<0>(vec.begin(), vec.end(), 1); //error

错误:

error: no matching function for call to 
'find(std::vector<std::tuple<int, float, bool> >::iterator, std::vector<std::tuple<int, float, bool> >::iterator, int)'
note:   couldn't deduce template parameter 'template<class ...> class Container'
     auto iter = find<0>(vec.begin(), vec.end(), 1);
                                                             ^

我发现这很奇怪,因为它非常适合候选人的签名:

find(typename Container<Tuple<TupleArgs ...> >::iterator, typename Container<Tuple<TupleArgs ...> >::iterator, decltype (std::get<tupleIndex>(std::declval<Tuple<TupleArgs ...> >()))

为什么Container在这种情况下无法推断出来?我知道它可以通过模板化迭代器来完成,但我想在这种情况下具体化。

1 个答案:

答案 0 :(得分:4)

typename Container<Tuple<TupleArgs...>>::iteratornon-deduced context。编译器无法计算出迭代器来自哪个容器,因为它们之间不一定是一对一的映射。

正如您所建议的那样,最好的选择是将迭代器类型作为模板参数,以便可以正确推导出它们。