我正在开发一个相对简单的程序(实际上是一个计算器)。然而,我决定尽可能使我的程序组件通用,因为:
1.这是一个好的习惯。 2.它使事情变得有趣。
作为这个程序的一部分,我正在使用我编写的一个“元组”类。我知道已经存在一个类,但我喜欢完全控制我的代码,这只是一个练习。
我需要做的一件事是将表达式的元组(其中表达式本身是通用的)转换为包含表达式求值结果的元组。简而言之,我有以下内容(略去了微不足道的部分):
1.这是一个好的习惯。 2.它使事情变得有趣。
作为这个程序的一部分,我正在使用我编写的一个“元组”类。我知道已经存在一个类,但我喜欢完全控制我的代码,这只是一个练习。
我需要做的一件事是将表达式的元组(其中表达式本身是通用的)转换为包含表达式求值结果的元组。简而言之,我有以下内容(略去了微不足道的部分):
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 ()
的函子作为模板参数传递,但那也行不通。
boost::mpl::transform
。 - n. m.