gpt4 book ai didi

c++ - 指定一个可以绑定(bind)到函数模板的模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:54 25 4
gpt4 key购买 nike

我正在尝试编写一个高阶函数,它将环绕采用输入和输出迭代器的标准库函数。这是一次失败的尝试:

#include <algorithm>
#include <iostream>
#include <type_traits>
#include <vector>
using namespace std;

template <template <typename, typename> class Func, typename InpIt, typename UnaryFunction>
decltype(Func<InpIt, UnaryFunction>(declval<InpIt>(), declval<InpIt>(), declval<UnaryFunction>())) Apply(InpIt first, InpIt last, UnaryFunction f)
{
return Func<InpIt, UnaryFunction>(first, last, f);
}

int main()
{
vector<int> a(5);
Apply<for_each>(a.begin(),
a.end(),
[](int i)
{
cout << i << endl;
});
return 0;
}

Clang 3.5 失败

high.cpp:16:3: error: no matching function for call to 'Apply'
Apply<for_each>(a.begin(),
^~~~~~~~~~~~~~~
high.cpp:8:100: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'Func'
decltype(Func<InpIt, UnaryFunction>(declval<InpIt>(), declval<InpIt>(), declval<UnaryFunction>())) Apply(InpIt first, InpIt last, UnaryFunction f)

正确的表达方式是什么?另外,我最理想的是能够简单地说出类似的话

template <MagicIncantation Func, typename Range, typename ... Args>
MoreMagic Apply(Range&& rng, Args&& ... args)
{
using std::begin; using std::end;
Func(begin(rng), end(rng), args...);
}

当您想遍历整个范围时,允许避免指定迭代器。

最佳答案

您会在 this question/answer 中找到有用的信息,但结果是您不能将函数模板作为模板(模板)参数传递,因此以这种方式传递 std::for_each 是不可能的。

关于c++ - 指定一个可以绑定(bind)到函数模板的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330795/

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