- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个相对简单的程序(实际上是一个计算器)。但是,我已决定使程序的所有组件尽可能通用,因为:
作为这个程序的一部分,我正在使用我正在编写的 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!