gpt4 book ai didi

c++ - 推导容器和 initializer_list-s 的模板函数

转载 作者:可可西里 更新时间:2023-11-01 16:37:57 25 4
gpt4 key购买 nike

我想编写一个辅助函数,例如:

template <typename F, typename Range1, typename Range2>
auto helper(const Range1& left, const Range2& right, F&& pred)
{
using namespace std; // for cbegin/cend and ADL
return pred(cbegin(left), cend(left), cbegin(right), cend(right));
}

它适用于容器:

std::vector<int> v1 = {1,2,3,4,5,6};
std::vector<int> v2 = {5,4,3,2,1,6};

std::cout << helper(v1, v2, [](const auto&... args){ return std::is_permutation(args...);}) << std::endl;

但它无法推断出 initializer_list-s ( example ):

std::cout << helper({1,2,3,4,5,6}, {5,4,3,2,1,6}, [](const auto&... args){ return std::is_permutation(args...);}) << std::endl;

是否有一种惯用的方法来重写 helper 以便它推导出容器和 initializer_list-s?

我想不出比 overloads for all combinations of container and initializer_list 更好的东西了.

最佳答案

我认为这里的根本问题是像 { 1, 2, 3 } 这样的 braced-init-list只是一个初始化器 而不是 std::initializer_list<T> 类型的对象.它可以潜在地用于初始化某个给定类型的对象。但它本身不是任何类型的对象。而且rules for function template argument deduction里面好像什么都没有那会让你得到一个std::initializer_list<T>来自 braced-init-list 参数,除非你的函数参数已经声明为某种 std::initializer_list<T>开始。

所以我担心编写这些重载将是最简单的解决方案......

关于c++ - 推导容器和 initializer_list-s 的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605556/

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