3

C++ ライブラリのラッパー バインディングを生成するコンテキストでこれを求めています。サンプルコード:

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

ラッパー バインディングは、extern "C" 関数で記述されます。この関数では、型にアクセスできる必要があります (入れ子になった型宣言はパブリックである必要があります)。で保護された宣言にアクセスするための簡単な回避策はclasses、クラスから継承し、extern "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; }

非常に単純ですが、継承できないため、このトリックはユニオンでは使用できません。extern "C" 関数からユニオンのネストされた保護された宣言にアクセスできるようにするために使用できるトリックを知っていますか?

これを許可する目的は、ターゲット言語で C++ ライブラリの 1 対 1 のミラーを作成することです。つまり、ターゲット言語はライブラリと同じアクセス指定子を持つことになります。「C」関数は、C++ コードとターゲット言語コードの間の接着剤です (ネストされた宣言を常にラップするとは限りませんが、SWIG もこの方法を使用します)。

個人的には、ライブラリ ラッパーを作成するという唯一の目的で、非パブリック シンボルを特別な構文でパブリックとして再宣言するために使用できる、何らかの g++ 拡張機能が欲しいと思っています。これにより、コードジェネレーターが大幅に簡素化されます。

4

1 に答える 1

0

単純なラッパーを使用できない理由:

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

class Z12 : public UnionWrapper
{
};

これは、恐怖症を回避するための単なる作業です。

于 2012-08-04T04:44:55.360 に答える