gpt4 book ai didi

c++ - 在 C++ 中作为参数的多态(通用)函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:23 24 4
gpt4 key购买 nike

我正在开发一个相对简单的程序(实际上是一个计算器)。但是,我已决定使程序的所有组件尽可能通用,因为:

  1. 这是很好的做法。
  2. 它让事情变得有趣。

作为这个程序的一部分,我正在使用我正在编写的 Tuple 类。我知道一个类已经存在,但我喜欢完全控制我的代码,这只是一个练习。

我需要做的一件事是将一个表达式元组(其中表达式本身是通用的)转换为一个包含表达式求值结果的元组。简而言之,我有(省略了一些琐碎的部分):

template <class T>
class Expression {

public:
virtual T Eval() = 0;

// ...
};

template <class First, class ... Rest>
class Tuple {

// ...

private:
First first;
Tuple<Rest ...> rest;
};

我想专注于像这样的通用类型的元组:

template <template <class> class R, class First, class ... Rest>
class Tuple<R<First>, R<Rest> ...> {

// and here is the problem:
Tuple<First, Rest ...> Transform(function<template<class T> T(R<T>)>);
};

之后我可以这样做:

template <class T> // There has to be a better way to do this
T Eval(Expression<T>& expr){
return expr.Eval();
}

// ...
Tuple<First, Rest ...> tuple = exprs.Transform(Eval);

这里有几个地方我不确定如何处理事情,如果有真正的专家可以帮助我,我将不胜感激。我希望这段代码不会因为小缺陷而编译,但这不是重点——我主要担心的是我标记的那一行。如果我在学习 Haskell 的短暂时期没记错的话,这个函数应该是 Rank-2(如果不是请评论,我会删除标签)。它只是看起来不对。有什么办法吗?

更新:

有人建议我尝试传递一个带有通用 operator () 的仿函数作为模板参数,但这也不起作用。

最佳答案

C++14 中的常用技巧是使用一些 index_sequence(参见 here),然后使用类似的东西:

template<typename ... Args, size_t ... I>
auto evaluate(Tuple<Args ...> const& t, index_sequence<I...>)
{
return make_tuple(evaluate(get<I>(t))...);
}

参见,例如,this answer对于这种方法的一个例子(唯一的区别是这里额外调用了一个函数调用)。

因此,您在 Tuple 类中需要的是:

  • 自定义 get 函数的实现,其行为类似于 std::get,即接受可变索引参数。
  • 自定义 make_tuple 函数的实现,其行为类似于 std::make_tuple 并从逗号分隔列表构造元组。

此外,您需要一个函数模板evaluate,它能够计算单个表达式,但我想您已经有了。


编辑:我刚刚意识到以上内容可能对您帮助不大。相反,应该注意的是,您也可以递归地执行此操作:

template<typename ... Args>
auto evaluate(Tuple<Args ...> const& t)
{
return tuple_cat(make_tuple(evaluate(t.first)), evaluate(t.rest));
}

template<typename T> auto evaluate(Tuple<T> const& t) { return evaluate(t.first); }

同样,您需要一个 make_tuple 函数、一个元组连接器 tuple_cat 和一个单表达式求值器 evaluate

关于c++ - 在 C++ 中作为参数的多态(通用)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109264/

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