我正在为一个较旧的项目编写模板类,该模板类将使用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_typefalse_type,则可以使用所需的SFINAE开关轻松定义它们:
struct true_type {
  static const bool value = true;
  typedef bool type;
};

例如。

10-04 14:28