作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这可能是重复的,但我还没有在其他地方发现问题。给定以下代码:
#include <functional>
#include <algorithm>
#include <iostream>
#include <vector>
template<typename container_ty_>
auto where(container_ty_ const& V, std::function<bool(typename container_ty_::value_type const&)>&& comp)
-> std::vector<std::reference_wrapper<typename container_ty_::value_type>> {
std::vector<std::reference_wrapper<typename container_ty_::value_type>> cursor;
for(typename container_ty_::value_type const& VAL : V)
if(comp(VAL))
cursor.push_back(const_cast<typename container_ty_::value_type&>(VAL));
return cursor;
}
int main(int argc, char** argv) {
std::vector<int> tVect = {0, 5, 2, 1, 7, 9};
//Why must std::vector<int> be passed...
auto vec = where<std::vector<int>>(tVect, [](const int& V) -> bool { return V > 5; });
std::for_each(vec.begin(), vec.end(), [] (int& v) { std::cout << v++ << std::endl; });
std::cout << std::endl;
std::for_each(tVect.begin(), tVect.end(), [](int& v) { std::cout << v << std::endl; });
}
vec
所在的行正在分配,似乎需要的功能 std::vector<int>
传递给它以便编译。如果现在我得到:
testing.cpp:20:68: error: no matching function for call to ‘
where(std::vector<int>&, main(int, char**)::__lambda0)’
auto vec = where(tVect, [](const int& V) -> bool { return V > 5; });
我怀疑这是因为没有为 where
的第二个参数正确推导模板。任何人都可以向我解释为什么,我似乎处于停滞状态......
还有:命令行参数:g++ testing.cpp -g -o testing -std=c++11 -Wall
G++ 版本:g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
最佳答案
您可能对稍微更灵活的版本感兴趣,它:
保留源 vector 中值的常量性(取决于 vector 本身的常量性)
接受任何仿函数,不需要 std::function
-
#include <algorithm>
#include <iostream>
#include <vector>
template<typename container_ty_, class Comp>
auto where(container_ty_& V, Comp&& comp)
{
using value_type = typename container_ty_::value_type;
using reference =
std::conditional_t<
std::is_const<container_ty_>::value,
std::reference_wrapper<const value_type>,
std::reference_wrapper<value_type>
>;
std::vector<reference> cursor;
for(auto& VAL : V)
if(comp(VAL))
cursor.push_back(VAL);
return cursor;
}
int main(int argc, char** argv) {
std::vector<int> tVect = {0, 5, 2, 1, 7, 9};
//Why must std::vector<int> be passed...
auto vec = where(tVect, [](const int& V) -> bool { return V > 5; });
std::for_each(vec.begin(), vec.end(), [] (int& v) { std::cout << v++ << std::endl; });
std::cout << std::endl;
std::for_each(tVect.begin(), tVect.end(), [](const int& v) { std::cout << v << std::endl; });
}
关于c++ - 奇怪的模板演绎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106414/
我是一名优秀的程序员,十分优秀!