跳至主内容
框架 无框架

宏ILCCTDEMON0

定义文件: ilcp/cpext.h
ILCCTDEMON0(name, IlcCtClass, IlcFnName)
ILCCTDEMON1(name, IlcCtClass, IlcFnName, t1, nA1)
ILCCTDEMON2(name, IlcCtClass, IlcFnName, t1, nA1, t2, nA2)
ILCCTDEMON3(name, IlcCtClass, IlcFnName, t1, nA1, t2, nA2, t3, nA3)
ILCCTDEMON4(name, IlcCtClass, IlcFnName, t1, nA1, t2, nA2, t3, nA3, t4, nA4)
ILCCTDEMON5(name, IlcCtClass, IlcFnName, t1, nA1, t2, nA2, t3, nA3, t4, nA4, t5, nA5)
ILCCTDEMON6(name, IlcCtClass, IlcFnName, t1, nA1, t2, nA2, t3, nA3, t4, nA4, t5, nA5, t6, nA6)
创建新恶魔类的宏。

该宏定义了一个名为 "nameI的 demon 类,其中有n 个数据成员。 当n大于 0 时,必须将数据成员的类型和名称作为参数提供给宏。 每个数据成员由其类型 "Ti和名称 "datai 定义。 除了 "nameI类的定义外,该宏还定义了一个名为 "name的函数,用于创建 "nameI类的实例,并返回指向它的 "IlcDemon类的实例。

您不必使用该宏来定义恶魔。 如果宏的限制性过强,我们建议您直接定义一个 demon 类。

由于参数 "name用于命名 demon 类,因此无法在多个 demon 定义中使用相同的名称。

示例

Here's how to define a demon that calls the function MyConstraintI::reduceDomain(IlcIntVar var); of the constraint ct:

 ILCCTDEMON1 (CallReduceDomain, MyConstraintI,
           reduceDomain, IlcIntVar,var);

然后,这个宏会生成与下面几行类似的代码:

 classCallReduceDomainI:publicIlcDemonI{
      IlcIntVarvar;
 public:
      CallReduceDomainI(IlcCPEnginesolver、
                        MyConstraintI*CT、
                        IlcIntVaravar):
      IlcDemonI(cp,ct), var(avar) {}
      ~CallReduceRomainI(){}
      void propagate();
 };
 IlcDemon CallReduceDomain(IlcCPEnginesolver、
                        MyConstraintI*CT、
                        IlcIntVarvar){
      return newsolver.getHeap())
                  CallReduceDomainI(s,ct,var);
 }
 voidCallReduceDomainI::propagate(){
      ((MyConstraintI*)getConstraint())->reduceDomain(var);
 }

下面的语句创建了一个类 "CallReduceDomainI的实例,并返回一个指向它的句柄。

 CallReduceDomain(cp,ct,var);

更多信息,请参阅CP 优化器中的传播CP 优化器中的传播事件概念。

另请参阅: