使用 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&lt;class T&gt; struct convert&lt; MyContainer&lt;T&gt; &gt; /*common code*/ ; @piotr-s,不,我没有。它似乎工作。我昨天浏览了 C++ 书,但找不到这个结构。你能写下它是如何工作的并给出任何链接吗? 它是部分专业化。粗略地说,任何匹配模式的类型(在这种情况下,MyContainer)都使用该特化。 @nirname 是的。 ***.com/questions/388242/… @nimame 这不是模糊。它是通用的。如果你正在学习 C++,最好从 concrete 类开始。和 /use/ 标准库中的泛型(这样你就知道它们的“感觉”) 【参考方案1】:

到评论

其实情况要复杂一点。让我感到困惑的是,MyContainer 有两个模板参数,而 convert 只有一个。所以我应该写:template&lt;class A, class B&gt; struct convert&lt; Manager&lt;A, B&gt; &gt; /**/ ;

尝试可变参数偏特化

template <typename... Ts> 
struct convert< MyContainer<Ts...> >  

    using container_type = MyContainer<Ts...>;

    // ... the specialized implementation, once

;

【讨论】:

这个程序不是 c++11 程序。但对于第 11 版,这将是一个解决方案。 哦,好吧:那么确实,使用所需的确切参数数量来修复它 对于 c++98:template&lt;class A, class B&gt; struct convert&lt; Manager&lt;A, B&gt; &gt; /**/ ;

以上是关于使用 yaml-cpp 转换为模板类的主要内容,如果未能解决你的问题,请参考以下文章

如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]

从一个模板类转换为另一个(都派生自同一个基类)

C++:派生模板类和基类之间的向下转换和向上转换?

C ++将模板参数转换为其未签名版本

Item 46:需要类型转换时,应当在类模板中定义非成员函数

C++ 模板类绑定到 nodejs