【发布时间】:2015-05-08 16:47:33
【问题描述】:
我正在编写与库接口的 C++ 类。该库有一堆函数,如下所示:
图书馆.h
int FunctionA(int deviceNumber, ...);
int FunctionB(int deviceNumber, ...);
int FunctionC(int deviceNumber, ...);
int FunctionD(int deviceNumber, ...);
int FunctionE(int deviceNumber, ...);
我的 C++ 类的每个实例都有一个永远不会改变的关联 deviceNumber,因此我将 deviceNumber 存储为成员变量,每次调用库函数时,我都会将该成员作为函数调用的第一个传入争论。
这很好,我没有真正的理由改变它的方式。但出于好奇,我想知道 C++ 是否有任何机制来“转换”参数,让我避免在每次调用中传递相同的参数。实现这一点的明显方法是重载所有内容。假设我的班级名为Foo:
Foo.cpp
int Foo::FunctionA(...) {
// deviceNumber_ is a const member
return ::FunctionA(deviceNumber_, ...);
}
唯一的问题是每个函数调用都需要一个方法,所以随着库的增长,如果没有代码生成器,它会变得越来越烦人。
是否有任何通用的方法来提供重载行为而不实际重载函数? C++ 中是否有一种机制可以将一个参数“扩展”为多个参数?我想象它会是这样的:
// These two calls are equivalent
FunctionA(deviceNumber, ...);
FunctionA(Magic(...));
// Magic() expands the arguments, adding deviceNumber
即使解决方案比不理会所有内容更丑陋且可读性差,但我很好奇它是否可能。在四处搜索之后,可变参数模板似乎是最接近的匹配项,但我无法真正理解如何使用它们来实现这一点。
【问题讨论】:
-
如何将 deviceNumber 设为私有值。并制作基类。那么继承的成员函数就不需要使用devicenumber了。
-
宏能工作吗?
#define MAGIC(...) deviceNumber_, __VA_ARGS__ -
宏也是不错的选择,差别很小
-
@cpplover-SlwEssencial - 你能举个例子说明一下吗?难道我还不需要手动重载每个库调用吗?
-
@KerrekSB - 哇,我完全不知道可变参数宏是一回事。该宏似乎运行良好。我将不理会所有事情,因为我无法将任何预处理器魔法偷偷带入代码中,但这绝对是一个很酷的解决方案。谢谢。