0

我有一个围绕 win32/pthreads 的 C++ 线程包装类。问题出在我的标题中,我需要大量的 biggie-include,例如 windows.h 和 boost::function,用于在下面声明我的 typedef。

有没有办法解决?我知道您可以转发声明类和结构,但是诸如 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_MEAN但在他们自己的windows.h包含之前包含您的头的人会意外地得到精益和平均。

编辑:我认为boost::function在标题中使用很好,因为无论环境如何,包含总是相同的。只要您始终将其公开Task而不是其function本身,就可以将其视为界面的一部分。

于 2012-08-31T15:38:07.807 回答