[英]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.