重载C ++运算符时运行特定代码

时间:2010-12-20 18:45:50

标签: c++ operator-overloading overloading

我有一个类,我们称之为 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)

关于如何解决这个问题的任何想法(如果可以的话)?

3 个答案:

答案 0 :(得分:2)

您可以创建单独的代理对象返回类型,因此在为该代理对象定义运算符时,您可以知道它之前已经存在哪些类型。

答案 1 :(得分:0)

您必须先创建语法树,然后再对其进行评估。因此,您正在创建一种DSL,特定于域的语言。

读这个 http://codeidol.com/cpp/cpp-template-metaprogramming/Domain-Specific-Embedded-Languages/-10.5.-Blitz-and-Expression-Templates/

或者你可以使用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;
}