我正在使用 xsd从 xml 架构文件创建 C++ 代码。对于 xml 类型,创建了多个函数(用于序列化等)。
如果该类型称为 XmlType,则会创建以下形式的多个函数:
XmlType XmlType_(const XmlType& a, const string& b)
string XmlType_(const XmlType& a)
...
这是普通函数,不是 XmlType 的成员,它们都具有相同的名称。 对于 XmlType2,函数将被称为 XmlType2_。
我想为我的 xml 方案的所有不同 xml 类型编写一个实用程序模板类。不同的功能将在本类(class)中称为洞察力。到目前为止,我所拥有的是这样的:
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 {
...
};
如果必须这样创建 XmlUtil 类的实例:
XmlUtil<XmlType, XmlType_, XmlType_> util;
当我必须将更多函数作为参数传递时,这感觉有点多余并且变得更糟。
我想像这样使用 util 类:
XmlUtil<XmlType, XmlType_> util;
或者像这样更好
XmlUtil<XmlType> util;
我能想到的唯一方法就是不知何故使用define,但感觉不对。
还有其他方法吗?
编辑: 我现在正在使用定义:
#define TRPL(name) name, name ## _, name ## _
...
XmlUtil<TRPL(XmlType)> util;
如果我发现更好的东西(可能会像 Yakk 在他的回答中建议的那样覆盖设置),我会编辑它。
最佳答案
这个:
XmlUtil<XmlType> util;
是不可能的,因为没有办法从 XmlType
到 XmlType_
。它们的关系在自动代码生成器之后被丢弃。
但是这样:
XmlUtil<XmlType_> util;
有可能。您可以推断出 XmlType_
的函数类型,然后使用推断出的返回类型,即 XmlType
。我相信有用于此目的的标准库函数。
至于两个不同的重载,那可能更棘手。我认为您不能将函数重载集作为模板参数传递,解析是在模板参数的上下文中对模板参数完成的,并将其传递给一个函数。我不认为有一种方法可以在不使用预处理器的情况下推迟此操作。
所以我认为您应该使用#define
。总比没有好。
关于c++ - 具有相同名称但参数类型不同的多个函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17614458/