POD类型作为结构的代理

POD types as proxies for structures

本文关键字:代理 结构 类型 POD      更新时间:2023-10-16

我想将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];}

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

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类型的实际含义(在问题标题中需要(,此答案可能不够。

根据此答案:C POD类型不能具有任何构造函数吗?:

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;
}

IDEONE

的生活演示