我正在使用xsd从xml架构文件创建c ++代码.对于xml类型,创建了多个函数(用于序列化等).
如果类型被称为XmlType,则创建以下形式的多个函数:
XmlType XmlType_(const XmlType& a, const string& b)
string XmlType_(const XmlType& a)
...
Run Code Online (Sandbox Code Playgroud)
这是普通函数,而不是XmlType的成员,它们都具有相同的名称.对于XmlType2,函数将被称为XmlType2_.
我想为我的xml方案的所有不同xml类型编写一个实用程序模板类.不同的功能将在本课程中被称为洞察力.到目前为止我所拥有的是这样的:
template<typename T>
using TFunc1 = T (*)(const T&, const string&);
template<typename T>
using TFunc2 = string (*)(const T&);
template<typename T, TFunc1<T> func2, TFunc2<T> func2>
class XmlUtil {
...
};
Run Code Online (Sandbox Code Playgroud)
当创建XmlUtil类的实例时,如果必须这样做:
XmlUtil<XmlType, XmlType_, XmlType_> util;
Run Code Online (Sandbox Code Playgroud)
当我必须传递更多函数作为参数时,这感觉有点多余并且变得更糟.
我想像这样使用util类:
XmlUtil<XmlType, XmlType_> util;
Run Code Online (Sandbox Code Playgroud)
或者甚至更好
XmlUtil<XmlType> util;
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是以某种方式使用define,但感觉不对.
还有其他办法吗?
编辑: 我现在正在使用一个定义:
#define TRPL(name) name, name ## _, name ## _
...
XmlUtil<TRPL(XmlType)> util;
Run Code Online (Sandbox Code Playgroud)
我会编辑这个,如果我找到更好的东西(也许像Yakk在他的回答中建议的覆盖集).
这:
XmlUtil<XmlType> util;
Run Code Online (Sandbox Code Playgroud)
是不可能的,因为没有办法从XmlType到XmlType_。它们的关系在自动代码生成器之后被丢弃。
然而这个:
XmlUtil<XmlType_> util;
Run Code Online (Sandbox Code Playgroud)
也许有可能。您可以推导 的函数类型XmlType_,然后使用推导的返回类型,即XmlType。我相信有用于此目的的标准库函数。
至于两种不同的重载,这可能会更棘手。我不认为您可以将函数重载集作为模板参数传递,解析是在模板参数上下文中的模板参数上完成的。我认为没有办法在不使用预处理器的情况下推迟此操作。
所以我认为你应该使用#define. 有总比没有好。