将模板指针传递给memcpy

时间:2014-04-01 07:09:12

标签: c++ templates memcpy

为什么以下不编译:

struct Carrier
{
  void* data;
  int StrategyRequestType;

  Carrier(int StrategyRequestType )
  {
    StrategyRequestType = StrategyRequestType;
  }

  template <typename T>
  bool loadStrategyRequestType(T)
  {
    data = malloc(sizeof(T));
    memcpy ( data, &T, sizeof(T) );   // Syntax error here - "expected primary expression before ',' token"
    return true;
  }
};

有什么方法可以让它发挥作用?

1 个答案:

答案 0 :(得分:9)

template <typename T>
  bool loadStrategyRequestType(T)
  {
    data = malloc(sizeof(T));
    memcpy ( data, &T, sizeof(T) );   // Syntax error here - "expected primary expression before ',' token"
    return true;
  }

您无法获取指向类型的指针。如果要将对象t复制到数据,请执行以下操作:

template <typename T>
  bool loadStrategyRequestType(T t)
  {
    data = malloc(sizeof(T));
    memcpy ( data, &t, sizeof(T) );
    return true;
  }

以上可能正常,但在创建对象时仍可能进行复制。因为,对象没有改变,这样可以更好地确保没有复制对象:

template <typename T>
  bool loadStrategyRequestType(const T& t)
  {
    data = malloc(sizeof(T));
    memcpy ( data, &t, sizeof(T) );
    return true;
  }

正如我在评论中提到的,在实现函数模板时,如果c ++ 11可用,最好使用通用引用。为什么?因为它们涵盖了所有可能的案例。

template <typename T>
  bool loadStrategyRequestType(T&& t)
  {
    data = malloc(sizeof(T));
    memcpy ( data, &t, sizeof(T) );
    return true;
  }