1

コードは言葉よりも優れているので、これを使用しますか?

struct StringEvent
{
    const void* source;
    const std::string str;

    StringEvent(const void* source, const std::string& str)
        : source(source), str(str) 
    { }
};

class StringEventListener
{
public:
    virtual void handler(const StringEvent& event) = 0;
}

class Test : public StringEventListener
{
public:
    void handler(const StringEvent& event) 
    { 
        std::cout << event.str << std::endl; 
    }
}

class EventSource
{
public:
    EventSource(StringEventListener* listener) 
    { 
        listener->handler(StringEvent(this, std::string("foo"))); 
    } 
}

int main()
{
    Test test;

    EventSource(&test);
}

これ以上?

class Test 
{
public:
    void handler(const std::string& str) 
    { 
        std::cout << str << std::endl; 
    }
};

class EventSource
{
public:
    EventSource(const boost::function<void (const std::string&)>& funcPtr)
    {
        funcPtr(std::string("foo"));
    }
};

int main()
{
    Test test;

    EventSource(boost::bind(&Test::handler, &test, _1));
}

クラス EventSource 呼び出しを行うにはtest.handler("foo")?

Java/C# の世界から来て、最初のアプローチは冗長ではありますが、より直感的だと思いますが、実際の状況で使用することをお勧めしますか、それとも価値/パフォーマンスヒットよりも多くの問題を引き起こしますか?

4

2 に答える 2

1

私は絶対に最初のバージョンを使用しません。それはひどい。2 番目のバージョンははるかに優れています。ラムダなども使用できます。

また、boost::function関数ポインタではありません。

于 2012-12-16T13:40:57.230 に答える
0

IMOでは、Boost/C++で「ファンクター」(静的メソッドを持つオブジェクト)を使用して、コールバックデータとコールバックオブジェクト(前の例)を保持する完全なオブジェクトよりも使用できます。

それはスタイルの問題であり、データを渡すオブジェクトが必要かどうかです。

于 2012-12-16T13:38:02.213 に答える