link
注意:这里可能出现的任何语法错误都不是当前问题的一部分。
我认为我不能使用的示例,以及原因:
可能地但这可能会使表达式树变得复杂。
template<typename ValueType>
Constraint : public Expression;
可能会影响未来的扩张。
IntConstraint : public Expression;
LongConstraint : public Expression;
DoubleConstraint : public Expression;
union Value
{
int AsInt,
float AsFloat
};
class Constraint : public Expression
{
public:
Value GetValue(Edge);
void SetValue(Value, Edge);
void SetUpper(Value, Vertex);
void SetLower(Value, Vertex);
...
};
编辑:响应Mads Elvheim(以及在找到
this link
为了使我的API易于使用,我使用bnf定义了语法(这对我来说是比较新的)。这导致了表达式、约束和其他与约束交互的类的抽象语法树。因为其他类将与约束交互,所以我宁愿在“最后一分钟”之前尽可能避免传递munch类型的信息。。我觉得我可能缺少了一个抽象的层次。
研究CPLEX给我的印象是,他们通过遵循数字域(整体和实)、线性方程表达式(当然)以及相应的可能,来建模他们的类型,这绝对有意义,嗯。。。
(显然,我不能发布多个链接,因为我是新用户。)
编辑2:作为第一步,我决定坚持
ConstraintExpressionArgument
另一个我可能忽略提到的细节是,与CPLEX中约束类本身不可用的情况不同,我的约束类当前是一个可用的用户类,但与CPLEX中一样,我也想留出扩展空间(因此存在键入问题)。。。
不管怎么说,目前我有相当于
class ConstraintExpressionArgument : public Expression;
template<typename ValueType>
class Constraint : public ConstraintExpressionArgument;