我在为C ++库生成包装器绑定的上下文中问这个问题。示例代码:
union Union
{
protected:
struct ProtClass
{
};
};
包装器绑定使用extern“C”函数编写,这些函数需要可访问的类型(IOW嵌套类型声明必须是公共的)。在classes
中访问受保护声明的一个简单的解决方法是从类继承并使用C ++的公共重新声明功能,该功能允许使用extern“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”函数访问union的嵌套受保护声明吗?
允许这样做的目的是在目标语言中创建C ++库的1对1镜像,这意味着目标语言将具有与库中相同的访问说明符。 “C”函数是C ++代码和目标语言代码之间的粘合剂(SWIG也使用此方法,尽管它并不总是包装嵌套声明)。
就个人而言,我喜欢使用某种g ++扩展,我可以使用某种特殊语法将非公共符号重新声明为公共符号,仅用于编写库包装器。这将极大地简化我的代码生成器。
答案 0 :(得分:0)
为什么不能使用简单的包装器:
struct UnionWrapper
{
union
{
protected:
struct ProtClass { };
};
};
class Z12 : public UnionWrapper
{
};
这只是一个关于phohibition的工作。