如何解决如何编写可变参数模板类?
据我所知,可变参数函数是采用可变数量参数的函数。
现在我想将它应用到我希望构造函数是可变参数的模板函数。我不知道这是否可能以及我如何才能做到这一点。因此,我的问题是: 是否有可能? 我该怎么做?
这是我的非可变参数模板类。我希望能够拥有不同数量的占位符参数 T(所以要么只有 T1,要么 T1、T2 或者 T1 到 T5)。
template<typename T1,typename T2>
class tXmlBase
{
public:
tXmlBase(tXmlDoc* doc,T1 id1);
tXmlBase(tXmlDoc* doc,T1 id1,T2 id2);
virtual ~tXmlBase();
protected:
tXmlDoc* xml_doc;
pugi::xml_node root_node;
pugi::xml_node base_node;
pugi::xml_node parent_node;
T1 identifier1;
T2 identifier2;
int n_childs;
int n_attr;
我读过这篇文章,但我不知道如何将其翻译给我的班级:https://en.cppreference.com/w/cpp/language/parameter_pack
编辑:为了更清晰: 这样做的目的如下: 此类应处理存储在 xml 文件的特定节点内的信息。让我们假设以下 xml 文件结构:
<root>
<node>
<elem id="1">
<low_level_info type="info" content="abc"/>
<low_level_info type="info" content="xyz" />
</elem>
<elem id="2">
...
</elem>
<node>
<node>
...
</node>
</root>
所以有些节点只是节点,仅通过位于同名节点(此处为“名称”)之前出现后的第二个位置来区分,其他节点则通过一个或多个属性(id,内容,类型)进行区分.
而且我希望我的班级能够处理我有不同的方法来区分这些节点。
解决方法
由于无法创建可变参数数据成员,因此您必须使用 std::tuple
。剩下的就很简单了:
template<typename... Ts>
class tXmlBase
{
public:
tXmlBase(tXmlDoc* doc,Ts const&... id1);
// if you have no other virtual member,it's better to remove this.
virtual ~tXmlBase();
protected:
tXmlDoc* xml_doc;
pugi::xml_node root_node;
pugi::xml_node base_node;
pugi::xml_node parent_node;
std::tuple<Ts...> identifiers;
int n_childs;
int n_attr;
};
如果你想为所有标识符做一些事情,你可以使用可变参数 lambda 和 std::apply
:
std::apply(
[](auto&... id) {
// expands into (id1.something(),id2.something(),...)
(id.something(),...);
},identifiers
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。