我正在为一个较旧的项目编写模板类,该模板类将使用Visual Studio 2008 SP1进行编译。模板类使用数据struct
,该数据将在几个正在运行的进程之间的named file-mapping object中共享。因此,我的IPC_SHARED_DATA
成员的条件是仅包含没有构造函数的原始数据类型。
struct IPC_SHARED_DATA{
//IMPORTANT: All members should not have constructors!
int nVal;
DWORD dwVal;
BYTE bytes[16];
};
问题是,可以在
IPC_SHARED_MEM
模板类中将其设置为条件吗?template <class DATA_T>
class IPC_SHARED_MEM
{
public:
IPC_SHARED_MEM()
: hMutexIpc(NULL)
, hSharedMemIpc(NULL)
{
//Initialization
//...
}
~IPC_SHARED_MEM()
{
}
// ... other functions
private:
DATA_T data; //Data being passed in shared memory
HANDLE hMutexIpc; //IPC named mutex for synchronized access to 'data'
HANDLE hSharedMemIpc; //IPC named file mapping object handle
};
它将被这样使用:
IPC_SHARED_MEM<IPC_SHARED_DATA> globalSharedMem;
最佳答案
在C++ 03中无法定义真正通用的is_pod
特性。您可以做的是将基本类型“列入白名单”,并允许将用户类列入白名单。例如:
template<typename T> struct is_pod : public false_type {};
#define DEFINE_POD(type) template<> struct is_pod<type> : public true_type {}
DEFINE_POD(char); // continue with all predefined pod types
// Somewhere in user code:
class MyClass { int foo; };
DEFINE_POD(MyClass);
如果库中不存在
true_type
和false_type
,则可以使用所需的SFINAE开关轻松定义它们:struct true_type {
static const bool value = true;
typedef bool type;
};
例如。