使用 yaml-cpp 转换为模板类
Posted
技术标签:
【中文标题】使用 yaml-cpp 转换为模板类【英文标题】:Converting with yaml-cpp to a template class 【发布时间】:2015-01-13 10:59:21 【问题描述】:我有自己的容器:
template<class T>
class MyContainer
我正在使用 yaml-cpp 将一些数据加载到这个容器中。
所以我需要为convert
struct 写专业化:
template<> struct convert< MyContainer<int> > ;
template<> struct convert< MyContainer<double> > ;
template<> struct convert< MyContainer<char> > ;
template<> struct convert< MyContainer<MyClass> > ;
...等等。
最后,我写:
// ...
node.as< MyContainer<int> >
// ...
但事实是MyContainer
的每个专业化都是相同的。
因此,convert
的每个特化都是相同的,它们是多余的:
template<> struct convert< MyContainer<int> > /* the same code */ ;
template<> struct convert< MyContainer<double> > /* the same code */ ;
template<> struct convert< MyContainer<char> > /* the same code */ ;
template<> struct convert< MyContainer<MyClass> > /* the same code */ ;
是否可以使用 c++ 本身或 yaml-cpp 的一些其他功能来避免这种垃圾?
【问题讨论】:
您是否尝试过部分专业化,例如:template<class T> struct convert< MyContainer<T> > /*common code*/ ;
?
@piotr-s,不,我没有。它似乎工作。我昨天浏览了 C++ 书,但找不到这个结构。你能写下它是如何工作的并给出任何链接吗?
它是部分专业化。粗略地说,任何匹配模式的类型(在这种情况下,MyContainer到评论
其实情况要复杂一点。让我感到困惑的是,MyContainer 有两个模板参数,而 convert 只有一个。所以我应该写:
template<class A, class B> struct convert< Manager<A, B> > /**/ ;
尝试可变参数偏特化
template <typename... Ts>
struct convert< MyContainer<Ts...> >
using container_type = MyContainer<Ts...>;
// ... the specialized implementation, once
;
【讨论】:
这个程序不是 c++11 程序。但对于第 11 版,这将是一个解决方案。 哦,好吧:那么确实,使用所需的确切参数数量来修复它 对于 c++98:template<class A, class B> struct convert< Manager<A, B> > /**/ ;
以上是关于使用 yaml-cpp 转换为模板类的主要内容,如果未能解决你的问题,请参考以下文章
如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]