簡體   English   中英

使用私有結構的解決方法

[英]Workaround for using a private struct

我正在為我的控制台應用程序使用引擎。 此引擎無法更改。 該引擎包含一個名為 Mesh 的 class。 這個 class findBoundaryLoops()中有一個公共方法,我在我的 class 中使用它(它不是引擎的一部分),但我必須向該方法傳遞一個參數,該方法的VertexLoop類型被定義為私有屬性。 我不確定我是否解釋得很好,所以有一個代碼表示:

網格.h:

class Mesh final
{
private:
    ...
    struct VertexNode
    {
        Edge connectingEdgeWithNext;
        Vertex vertex;
        VertexNode* prev;
        VertexNode* next;

        float angle;
    };

    struct VertexLoop
    {
        VertexNode* firstNode;
        uint32_t nodeCount;
        template<typename Callable>
        void forEachNode(Callable&& f)
        {
            VertexNode* n = firstNode;
            for (uint32_t i = 0; i < nodeCount; ++i, n = n->next)
            {
                f(n);
            }
        }
    };
    ...

public:
    ...
    void findBoundaryLoops(memory::MemoryArena& arena, vector<VertexLoop>& loops) const;
    ...
};

我必須使用findBoundaryLoops()方法,但VertexLoop結構是私有的。 是否有解決方法或解決此問題的方法?

這個答案有兩個部分。 下面我將向您展示如何訪問私有部分中聲明的類型。 但我認為重要的一點,也是我把它放在第一位的原因,是要意識到你不應該需要下面的解決方案。 任何人都可以訪問VertexLoop 名稱是私有的,類型不是。 首先在私有部分聲明它是沒有意義的。 如果類型出現在公共方法的簽名上,您也可以將其放在公共部分。

如果這是庫代碼或生成的代碼,那么要么你誤解了它的使用方法,要么它被認為是壞的。


更簡單的例子:

#include <vector>

struct foo {
    private:
        struct bar{};
    public:
        void f(std::vector<bar>&){}
};

現在我們編寫一個特征,給定foo的成員 function 和一個vector參數告訴我們該向量的value_type 然后我們用指向foo::f的指針實例化它以獲得bar的別名:

template <typename X> 
struct bar_type;

template <typename T> struct bar_type< void(foo::*)(std::vector<T>&)> { using type = T; };

using public_bar = bar_type<decltype(&foo::f)>::type;

使用它:

int main() {
    std::vector<public_bar> v;
    foo f;
    f.f(v);
}

現場演示

也許值得一提的是,這絕不可與訪問 class 的私人成員的“骯臟黑客”相提並論(是的,它們確實存在)。 這不是 hack,它是獲取公共方法的參數類型的特征的完美部分特化。


TL; DR只是不要這樣做。 VertexLoop移動到公共部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM