推断容器和initializer_list-s的模板函数

Dev*_*ull 9 c++ templates initializer-list c++14 c++17

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

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));
}
Run Code Online (Sandbox Code Playgroud)

它适用于容器:

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;
Run Code Online (Sandbox Code Playgroud)

但它没有推断initializer_list--s(例子):

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;
Run Code Online (Sandbox Code Playgroud)

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

对于容器和容器的所有组合,initializer_list我无法想出任何比重更好的东西.

Mic*_*zel 7

我认为这里的基本问题是braced-init-list就像{ 1, 2, 3 }一个初始化器而不是类型的对象std::initializer_list<T>.它可能用于初始化某种给定类型的对象.但它本身并不是任何类型的对象.在函数模板参数推导规则中似乎没有任何东西允许你std::initializer_list<T>braced-init-list参数中获取一个,除非你的函数参数已经被声明为某种std::initializer_list<T>开头.

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