3

我在为 C++ 库生成包装器绑定的上下文中问这个问题。示例代码:

union Union
{
protected:
    struct ProtClass
    {
    };
};

包装器绑定是用 extern "C" 函数编写的,它要求类型是可访问的(IOW 嵌套类型声明必须是公共的)。访问受保护声明的简单解决方法classes是从类继承并使用 C++ 的公共重新声明功能,该功能允许在外部“C”函数中使用声明。例如:

class Class
{
protected:
    struct NestClass
    {
    };
};

class PubDeclClass : Class  // autogenerated
{
public:
    Class::NestClass;  // redeclare nested class as public (can also use 'using' here)
};

// autogenerated (normally generated only if NestClass isn't a POD type)
void* getNewNestClass() { return new PubDeclClass::NestClass; }

很简单,但是这个技巧不能用于联合,因为它们不能被继承。你知道我可以使用什么技巧来从外部“C”函数访问联合的嵌套保护声明吗?

允许这样做的目的是在目标语言中创建 C++ 库的一对一镜像,这意味着目标语言将具有与库中相同的访问说明符。“C”函数是 C++ 代码和目标语言代码之间的粘合剂(SWIG 也使用这种方法,尽管它并不总是包装嵌套声明)。

就个人而言,我很想拥有某种 g++ 扩展,我可以使用它来使用一些特殊的语法将非公共符号重新声明为公共,其唯一目的是编写库包装器。这将极大地简化我的代码生成器。

4

1 回答 1

0

为什么不能使用简单的包装器:

struct UnionWrapper
{
    union
    {
    protected:
        struct ProtClass { };
    };
};

class Z12 : public UnionWrapper
{
};

这只是一个围绕 phohibition 的工作。

于 2012-08-04T04:44:55.360 回答