Я пишу класс C++, который взаимодействует с библиотекой. Библиотека имеет кучу функций, которые выглядят следующим образом:Аргументы функции «Преобразование»
Library.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__' –
Macro также является хорошим выбором для очень небольшой разницы –