我有一个类,我们称之为 Foo ,其中包含以下3个方法(重载左关联<二元运算符):
... operator<(A a) { return *this; }
... operator<(B b) { return *this; }
... operator<(C c) { return *this; }
A,B,C类没有任何关联(如果是,无论如何)。
现在在我的程序中我只有以下两种情况:
A a = new A();
B b = new B();
C c = new C();
(First Case): new Foo() < a < b;
或
(Second Case): new Foo() < a < b < c;
每当我有第一个案例(以b
结尾)时,我想在读取(我知道)b实例时执行函数run()。所以我的想法是在 Foo 类中使用以下代码:
... operator<(B b)
{
run();
}
现在当我有第一个案例的代码时,run()
正在执行。
问题在于,当我有第二种情况下的代码时(以c
结尾)。
我想再次执行run()
函数,但直到我知道c
是什么。
因此,如果我在执行run()
时会调用上一段代码< b
这不是我想要的,因为我还不知道c
。
如果我在run()
中添加operator<(C c)
,我会拨打run()
两次。
简而言之,我想要完成的是在第run()
次operator<(B b)
时进行第一次案例调用,当我第二次调用时只调用operator<(C c)
。
关于如何解决这个问题的任何想法(如果可以的话)?
答案 0 :(得分:2)
您可以创建单独的代理对象返回类型,因此在为该代理对象定义运算符时,您可以知道它之前已经存在哪些类型。
答案 1 :(得分:0)
您必须先创建语法树,然后再对其进行评估。因此,您正在创建一种DSL,特定于域的语言。
或者你可以使用boost :: proto
答案 2 :(得分:0)
class PreFoo {
public:
PreFoo() { ... }
PreFoo & operator<<(A a) { ...; return *this; }
PreFoo & operator<<(B b) { ...; return *this; }
PreFoo & operator<<(C c) { ...; return *this; }
int aa, bb, cc; // save your information
};
PreFoo MakeFoo() { return PreFoo(); }
class Foo {
public:
Foo(const PreFoo & pre) { run(); } // implicit conversion
void run() {} // your run!!
};
void g() {
A a; B b; C c;
// implicit conversion at the end
Foo foo1 = MakeFoo() << a << b;
Foo foo2 = PreFoo() << a << b << c;
}