2012-08-31 18 views
0

我有一个围绕win32/pthreads的C++线程包装类。问题出在我的头文件中,我需要很多biggie-include,例如windows.h和boost :: function,以便在下面声明我的typedefs。包含文件,类型定义和转发decl

有没有办法解决这个问题?我知道你可以转发声明类和结构体,但数据类型如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; 

    }; 

感谢

+0

'HANDLE'只是一个'void *'。只要说'typedef void * ThreadHandle;'对于WINAPI数据类型,你可以找到我的来源[here](http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v = vs。 85)的.aspx)。 – chris

+0

你不能在你的课堂外面移动typedef吗? – Jaywalker

+0

他们为什么要在课外?将句柄声明为类的一部分是不是更有意义? – KaiserJohaan

回答

1

我会认为这是不是你真正的代码,因为我看不出包括能够在你的类定义的中间工作。

在这种情况下,您可能根本不想公开本机线程标识符。相反,提供抽象的功能可以以一种理智的方式在线程上进行操作,并且不会暴露诸如HANDLE之类的实现细节。然后,您可以将包含文件移动到源文件并避免问题。

还要注意的是做一个头文件中的WIN32_LEAN_AND_MEAN + #include <Windows.h>意味着有人不希望WIN32_LEAN_AND_MEAN但包括你的头之前自己windows.h包括将得到精简和均值意外。

编辑:我觉得可以在头文件中使用boost::function,因为无论环境如何,include都是一样的。只要您始终将其公开为Task而不是function本身,它可以被视为界面的一部分。

+0

boost :: function是什么? – KaiserJohaan