gpt4 book ai didi

c++ - 奇怪的模板演绎

转载 作者:太空狗 更新时间:2023-10-29 22:59:01 25 4
gpt4 key购买 nike

这可能是重复的,但我还没有在其他地方发现问题。给定以下代码:

#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

最佳答案

您可能对稍微更灵活的版本感兴趣,它:

  1. 保留源 vector 中值的常量性(取决于 vector 本身的常量性)

  2. 接受任何仿函数,不需要 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com