POD类型作为结构

时间:2018-02-13 15:02:25

标签: c++

我想将POD类型用作某些结构的代理。更确切地说,我尝试做以下事情:

struct Foo { /* some fields */ };

extern Foo global_array[SIZE]; // initialized elsewhere

struct Proxy
{
  Foo* pointer_;
}

Proxy get_first_element_as_pointee()
{ 
  return &global_array[0];
}

在上面的代码中,我有一个包含Foo结构的全局C数组,我想得到第一个。但是,我不想暴露Foo而是代理。问题是转换不起作用。我收到以下错误消息:

  

错误:无法转换'& global_array [0]'从'Foo *'到'Proxy'{return& global_array [0]; }

编辑:我修改了我的问题,以便更清楚

1 个答案:

答案 0 :(得分:0)

get_first_element_as_pointee()尝试返回Foo*,但需要Proxy。编译器引发错误,因为它“不知道”如何将Foo*转换为Proxy

虽然我很欣赏Yola的伎俩,但我的情况有点不同而且更简单:

“解释”的一种可能方法是为struct Proxy定义转换构造函数:

struct Foo { /* some fields */ };

extern Foo global_array[SIZE]; // initialized elsewhere

struct Proxy
{
  Foo* pointer_;

  // This is the trick: provide a "conversion constructor".
  Proxy(Foo *pointer): pointer_(pointer) { }
};

Proxy get_first_element_as_pointee()
{ 
  return &global_array[0];
}

回顾POD类型的实际含义(问题标题中需要),这个答案可能还不够。

根据SO: Can't C++ POD type have any constructor?的答案:

  

POD表示普通旧数据类型,根据定义,它不能具有用户定义的构造函数。

该死的 - 我的错。

另一个答案(没有转换构造函数甚至更简单)并且最初由@bolov提供但删除了:

struct ProxyPOD
{
  Foo* pointer_;
};

ProxyPOD get_first_element_as_pointee2()
{ 
  ProxyPOD proxy = { &global_array[0] }; // as you would do in C
  return proxy;
}

life demo on ideone