问题描述
我正在尝试进行一些类型转换以将不同的 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::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 (将#修改为@)