0

win32/pthreads の周りに C++ スレッド ラッパー クラスがあります。問題はヘッダーにあります。以下で typedef を宣言するために、windows.h や boost::function などの大きなインクルードが必要です。

これを回避する方法はありますか?クラスと構造体を前方宣言できることは知っていますが、win32 HANDLE のようなデータ型と名前空間のテンプレート化された関数は...?

    #include "boost/function.hpp"

    /* Thread wrapper class */
    class IThread
    {
    public:
        #if defined _WIN32 || _WIN64
            #define WIN32_LEAN_AND_MEAN
            #include <Windows.h>
            #undef WIN32_LEAN_AND_MEAN
            typedef HANDLE ThreadHandle;  
        #else
            #include <pthread.h>
            typedef pthread_t ThreadHandle;
        #endif

        enum ThreadState
        {
            DETACHED = 0,
            RUNNING,
            FINISHED
        };

        typedef boost::function1<void, void*> Task;

        virtual ~IThread() { }

        IThread& operator=(IThread& other);
        virtual int32_t Join() = 0;
        virtual int32_t SetPriority(int32_t priority) = 0;

        virtual ThreadHandle& GetNativeHandle() = 0;
        virtual ThreadState GetThreadState() const = 0;

    };

ありがとう

4

1 に答える 1

1

クラス定義の途中でインクルードがどのように機能するかわからないため、これは実際のコードではないと思います。

この場合、おそらくネイティブスレッド識別子をまったく公開したくないでしょう。代わりに、スレッドに対して適切な方法で動作する抽象的な機能を提供し、などの実装の詳細を公開することはありませんHANDLE。次に、インクルードをソースファイルに移動して、問題を回避できます。

また、ヘッダーファイルでWIN32_LEAN_AND_MEAN+を実行するということは、自分のインクルードの前にヘッダーをインクルードしたくない人が予期せず無駄を省くことを意味することに注意してください。#include <Windows.h>WIN32_LEAN_AND_MEANwindows.h

boost::function編集:インクルードは環境に関係なく常に同じであるため、ヘッダーで使用するのは問題ないと思います。Taskそれ自体ではなく、常に公開している限りfunction、インターフェースの一部と見なすことができます。

于 2012-08-31T15:38:07.807 に答える