元组查找函数参数替换失败 所以,我刚刚在一些休息后回到C++,我想也许我应该写点东西来娱乐一下。在这里,我考虑了一个函数,它搜索元组的容器,并在元组的第n个元素满足要求时返回迭代器(值或一元函数)

元组查找函数参数替换失败 所以,我刚刚在一些休息后回到C++,我想也许我应该写点东西来娱乐一下。在这里,我考虑了一个函数,它搜索元组的容器,并在元组的第n个元素满足要求时返回迭代器(值或一元函数),c++,c++11,templates,tuples,C++,C++11,Templates,Tuples,以下是我现在写的: template<std::size_t tupleIndex, template<typename...> class Container, template<typename...> class Tuple, typename... TupleArgs> auto find(typename Container<Tuple<TupleArgs...>>::it

以下是我现在写的:

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;
} 
模板
自动查找(typename容器::迭代器it1,
typename容器::迭代器it2,
decltype(std::get(std::declval())searchedValue){
对于(;it1!=it2;++it1){
if(std::get(*it1)==searchedValue)
打破
}
返回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
使用Tuple=std::Tuple;
std::vector 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(vec.begin(),vec.end(),1)//错误
错误:

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);
                                                             ^
错误:没有用于调用的匹配函数
'查找(std::vector::iterator,std::vector::iterator,int)'
注意:无法推断模板参数“模板类容器”
auto iter=find(vec.begin(),vec.end(),1);
^
我觉得很奇怪,因为它完全符合候选人的签名:

find(typename Container<Tuple<TupleArgs ...> >::iterator, typename Container<Tuple<TupleArgs ...> >::iterator, decltype (std::get<tupleIndex>(std::declval<Tuple<TupleArgs ...> >()))
find(typename容器::迭代器,typename容器::迭代器,decltype(std::get(std::declval()))
为什么在这种情况下不能推断出
容器呢?我知道可以通过模板化迭代器来实现,但我想在这种情况下说得更具体一些。

typename Container::iterator
是一个容器。编译器无法计算迭代器来自哪个容器,因为tw之间不一定存在一对一的映射o


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

我看不出有理由对这个问题进行否决,否决者能否解释一下?就像我的一位程序员同事常说的那样,“编译器不会为类型求解方程”。