在处理嵌套容器的同时检查两个不同的类型是否包含在同一个容器中

问题描述

我正在尝试进行一些类型转换以将不同的 C++ 库连接在一起,其中每个库将具有类似类的不同实现,例如 Point 类,在此示例中,libraryA 将具有类 PointA,而 libraryB 将具有 PointB。我发现自己必须编写大量乏味的函数来处理不同容器以及每种类型的嵌套容器,以便将数据从一个容器复制到另一个容器。我找到并修改了一些代码,使我能够轻松地进行基本类型转换,如下所示:

template<typename from,typename to>
struct type_to_type_converter
{
    from to_convert;
    operator to();
};

template<typename from>
struct AnyTypes
{
    from to_convert;
    template<typename to,typename C = type_to_type_converter<from,to>>
    operator to()
    {
        C c = C{std::move(to_convert)};
        return c;
    }
};

template<typename from>
inline AnyTypes<from> from_type(from f)
{
    return AnyTypes<from>{std::move(f)};
}

这基本上让我可以创建一些类型运算符函数,以便任何类型对都可以相互转换。对于 PointA/PointB 的情况,我将定义两个运算符函数如下:

template<>
type_to_type_converter<PointA,PointB>::operator PointB()
{
    return PointB(to_convert.x(),to_convert.y()); //NOTE: to_convert is of type PointA
}

template<>
type_to_type_converter<PointB,PointA>::operator PointA()
{
    return PointA(to_convert.x,to_convert.y); //NOTE: to_convert is of type PointB
}

作为一个人为的例子,你会注意到两个 Point 类有不同的接口来暴露它们的 x 和 y 坐标。函数模板“from_type”然后允许我做这样的简单转换:

PointA a(1,2);
PointB b = from_type(a);

我的问题是,为了处理从 std::vector 到 std::vector 的转换,我必须为这些新类型明确定义一对新的运算符函数,如下所示:

template<>
type_to_type_converter<std::vector<PointA>,std::vector<PointB>>::operator std::vector<PointB>()
{
    std::vector<PointB> v;
    for (auto p : to_convert)
    {
        v.push_back(from_type(p)); //NOTE: Assumes prevIoUs deFinition of from_type() for PointA -> PointB
    }
    return v;
}

一个匹配的PointB->PointA函数来处理反向转换。然后,我必须对 std::vectorstd::vector std::vectorstd::vector 以及任何其他容器组合重复此操作。我对模板的了解实际上很差,我只能通过从其他 SO 帖子中窃取代码并将它们拼凑在一起来做到这一点。所以我的问题是:是否有可能通过根据一些编译时类型检查将 AnyTypes 结构运算符更改为 () 来自动处理不同的容器,以确定容器是否递归相同,以便每个嵌套容器迭代通过/剥离直到达到基本类型并且可以调用该对的 from_type 函数?到目前为止,我的要求只要求转换句柄匹配嵌套容器:

std::vector<std::vector<PointA>> <-> std::vector<std::vector<PointB>> 

std::vector<std::queue<PointA>> <-> std::vector<std::queue<PointB>> 

而不是混合转换,例如:

std::vector<std::vector<PointA>> <-> std::vector<std::queue<PointB>>

如果可以更容易地提出解决方案。

在我写这个问题时,我想到的一些事情包括修改 type_to_type_converter 结构以包含容器类型的类型名,为 AnyTypes 结构提供一个可变参数模板,可以允许专门化实现在检测到容器类型模板而不是“Point”(或任何其他类)类型时使用迭代器。

我发现可以检查两种不同类型的两个容器是否相同的东西,但是在运行一些测试之后,这无法处理嵌套容器,只能查看最外面的模板。 Check if two types are of the same template 我提到这一点的原因是我想确保这些类型转换不会被客户端代码误用,并且对于仅处理匹配的容器嵌套的解决方案进行了一些类型检查,这样它就会导致编译时错误和追踪运行时错误并不难。该解决方案的另一个限制是我目前使用 C++11。

现在,如果有强大的 C++ 代码功能的人看到这篇文章,我的最终目标将是能够使用赋值运算符进行隐式转换,而不是显式调用 from_type,正如我在nlohmann json 库 (https://github.com/nlohmann/json),但我并不贪婪,只是充满希望。任何有关此问题的帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)