gpt4 book ai didi

c++ - 带模板的高阶函数?

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

我使用 Clojure(一种函数式语言)编程已有一段时间了,而且我不得不使用 C++ 来上课。我一直在尝试使用我在 Clojure 中喜欢的一些功能(例如,高阶函数、lambda、参数线程、动态类型等),但我遇到了一些问题。

首先,我实现了一个函数 get它有两个参数:

  1. 一个集合( vector 、列表、 HashMap 等),以及
  2. 索引

并返回该索引处的元素。

我还实现了一个函数 conj它有两个参数:

  1. 集合( vector 、列表、队列等),以及
  2. 一个元素/对象(集合的任何类型)

并返回添加了元素的集合。对于 vector ,这与 push_back 基本相同。 .

现在,我希望能够像这样使用高阶函数“转发”或“串接”参数:

using std::vector;
vector<double> my_vec;

forward(my_vec, // take "my_vec"
conj(0.1), // "push" the value of 0.1 to the back of "my_vec"
get(0), // retrieve the first value
inc); // increment that value

inc(get(conj(my_vec, 0.1), 0);相同,但更 (!) 更具可读性。

forward的返回值在这种情况下应该是 1.1。

为了得到forward函数工作,初始参数之后的参数都需要是高阶函数。也就是说,它们的工作方式类似于以下内容:

template<typename Func>
Func get(int i){
return [i](vector<boost::any> coll)
-> boost::optional<boost::any> {
return get(coll, i);
};
}

但是,编译器无法推断要返回的 lambda 函数的类型。另外,我的猜测是基于我对 boost::any 极其有限的经验。 , 是它无法转换 vector<double>vector<boost::any> ,尽管明显声称boost::any它可以作为几乎任何类型的替代品。

我想要 get功能一般,所以我不想使用 boost::function<double (vector <double>, int)> ,或任何类似的特定类型。

此外,我正在使用 boost::optional而不是 vector返回 null_ptr如果索引来自 get出界了。

就目前而言,这就是我的 forward功能外观:

template <typename T1>
optional<T1> forward (T1 expr1){
return expr1;
}
template <typename T1, typename T2>
optional<T1> forward (T1 expr1, T2 expr2){
return forward(expr2(expr1));
}
template <typename T1, typename T2, typename T3>
optional<T1> forward (T1 expr1, T2 expr2, T3 expr3){
return forward(expr2(expr1), expr3);
}

等...

关于如何获得此 forward 的任何想法功能正常工作?

我也很确定有一种比像我那样进行元数重载更有效的方法来实现它。

最佳答案

只是对 HorSTLing 的回答的补充,实际上 forward 可以更容易地实现:

template <typename Value>
Value forward(Value v) {
return v;
}

template <typename Value, typename Func, typename... Funcs>
auto forward(Value v, Func f, Funcs... fs) -> decltype(forward(f(v), fs...)) {
return forward(f(v), fs...);
}

C++14 让事情变得更加甜蜜:

template <typename Value>
Value forward(Value v) {
return v;
}

template <typename Value, typename Func, typename... Funcs>
decltype(auto) forward(Value v, Func f, Funcs... fs) {
return forward(f(v), fs...);
}

查看完整代码 here (Coliru 似乎支持提升)

关于c++ - 带模板的高阶函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571415/

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