我正在制作一个表达式类:
template<typename T, typename U>
class expression
{
public:
expression(T vala, U valb, oper o){val1 = vala; val2 = valb; op = o;}
operator bool{return(val1 op val2);}
private:
T val1;
U val2;
oper op;
};
如您所见,这有点伪代码,因为我需要一个运算符类。我最初的想法是创建一个包含所有可能的运算符的数组,然后通过字符串转换它,但由于运算符的数量很多,以及如何通过二维数组将其转换为字符串,这是行不通的,其中n [0] [0]有第一个运算符,n [0] [1]有运算符字符串。
是否有人建议在我的表达式类中添加运算符值?
答案 0 :(得分:2)
也许是一个函数指针。而不是......
operator bool{return(val1 op val2);}
...将其编码为......
operator bool{return op(val1, val2);}
...在这种情况下op
可以是指向(任意)函数的指针,该函数接受两个参数并返回bool。
template<typename T, typename U>
class expression
{
public:
//define pointer-to-function type
typedef bool *oper(const T& val1, const U& val2);
... etc ...
答案 1 :(得分:2)
在c ++表达模板技术中使用了类似的方法。
使用apply或evaluate等方法将表达式创建为类。此方法获取参数并应用表达式。
查看表达式模板正在使用的内容。 http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html
作为您案例中的一个例子:
struct isEqual
{
template <typename T, typename U>
bool operator()(T a, U b)
{
return a == b;
}
};
template <typename T, typename OP>
struct expression
{
T& a;
T& b;
OP& op;
expression(T a, T b, OP op) : a(a), b(b), op(op) {}
void eval() { op(a,b); }
};
int main()
{
expression<int, isEqual> exp(1,2,isEqual());
exp.eval();
}
答案 2 :(得分:1)
我不完全确定你在问什么,但如果你试图将任意字符串作为运算符重载,你就不能。有一组有限的运算符可以在c ++中重载
见这里:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
你应该做的是在oper中重载operator()来创建一个函数对象并返回op(val1,val2)。
答案 3 :(得分:1)
您可以使用功能标准库并将您的参数作为:
std::tr1::function<bool (T,U)>
即:
#include <functional>
template<typename T, typename U>
class expression
{
public:
expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o)
{ }
operator bool{return op(val1, val2);}
private:
T val1;
U val2;
std::tr1::function<bool (T,U)> op;
};
然后,创建一个表达式:
#include <functional>
expression<int, int> foo(4,3, std::tr1::bind(greater()));
这是tutorial