c++ - 具有相同名称但参数类型不同的多个函数作为模板参数

标签 c++ c++11

我正在使用 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;

是不可能的,因为没有办法从 XmlTypeXmlType_。它们的关系在自动代码生成器之后被丢弃。

但是这样:

XmlUtil<XmlType_> util;

有可能。您可以推断出 XmlType_ 的函数类型,然后使用推断出的返回类型,即 XmlType。我相信有用于此目的的标准库函数。

至于两个不同的重载,那可能更棘手。我认为您不能将函数重载集作为模板参数传递,解析是在模板参数的上下文中对模板参数完成的,并将其传递给一个函数。我不认为有一种方法可以在不使用预处理器的情况下推迟此操作。

所以我认为您应该使用#define。总比没有好。

关于c++ - 具有相同名称但参数类型不同的多个函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17614458/

相关文章:

c++ - 可以返回 void 或非 void 值的模板仿函数包装器

c++ - 部分特化的模板子类化

c++ - 如何在编译时切换/选择类型?

c++ - 组成 std​​::integral_constant 值

c++ - FMOD 播放流示例

c++ - 关于 C++ 定时器的问题

c++ - Qt Creator 修改PATH环境变量

c++ - 模板化双模板类方法

c++ - C++11 中 lambda 的非确定性损坏

c++ - OpenAL 捕获音频时出错