c++ 使用私有结构的解决方法

agxfikkp  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(147)

我正在为我的控制台应用程序使用一个引擎。这个引擎不能更改。这个引擎包含一个名为Mesh的类。在这个类findBoundaryLoops()中有一个公共方法,我正在我的类中使用它(它不是引擎的一部分)但是我必须传递一个参数给这个方法,它的类型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结构体是私有的。是否有变通方法或其他方法可以解决这个问题?

vaqhlq81

vaqhlq811#

这个答案有两个部分。下面我将向你展示如何访问在private节中声明的类型。但是我认为重要的一点,这就是为什么我把它放在第一位,你应该意识到你不需要下面的解决方案。任何人都可以访问VertexLoop。名字是私有的,类型不是。一开始在私有部分声明它是没有意义的。如果类型出现在公共方法的签名上,那么您也可以将其放在public节中。
如果这是库代码或生成的代码,那么要么您误解了如何使用它,要么可以认为它已损坏。
更简单的例子:

#include <vector>

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

现在我们写一个trait,给定一个foo的成员函数,它有一个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);
}

Live Demo
也许值得注意的是,这绝不能与访问类的私有成员(是的,它们确实存在)的“肮脏的黑客”相提并论。这不是黑客,它是一个非常好的trait的部分特化,以获得公共方法的参数类型。

TL;DR不要这样做。将VertexLoop移到public部分。

相关问题