我有一个围绕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;
};
由于
答案 0 :(得分:1)
我认为这不是你真正的代码,因为我看不出包含在你的类定义中是如何工作的。
在这种情况下,您可能根本不想公开本机线程标识符。相反,提供抽象功能以理智的方式对线程进行操作,并且不会暴露实现细节,例如HANDLE
。然后,您可以将包含移动到源文件并避免问题。
另请注意,在标头文件中执行WIN32_LEAN_AND_MEAN
+ #include <Windows.h>
意味着某人不想WIN32_LEAN_AND_MEAN
但在他们自己的windows.h
之前包含您的标头意外地得到精益和平均。
编辑:我认为在标题中使用boost::function
是好的,因为无论环境如何,包含总是相同的。只要您始终将其公开为Task
而不是function
本身,就可以将其视为界面的一部分。