Поскольку проблема указана, вы не можете сделать это в стандартном C ++. Невозможно правильно вызвать функцию, если компилятор не знает параметры вызываемого во время компиляции. Даже в случае функции varargs вызывающий код должен быть скомпилирован, зная, какие аргументы переданы - нет никакого способа построить va_list
.
Если вы управляете функциями в dll, то, вероятно, лучше всего передать коллекцию boost::any
(если оба будут скомпилированы с одним и тем же компилятором и библиотеками) или void*
(если вы этого не сделаете иметь такую большую совместимость) или какую-либо сериализованную форму параметров (возможно, буфер протокола Google).
Если dll уже существует и вы не можете изменить ее интерфейс, то вам нужно либо сыграть нестандартные трюки со стеком, чтобы расположить параметры в нужном месте в соответствии с вашим соглашением о вызовах (что и делают динамические языки). когда у них есть механизм вызова C), или же вам нужен огромный оператор switch, охватывающий все сигнатуры функций, которые могут быть. Очевидно, что последнее возможно только в том случае, если у вас уже есть хорошее представление о том, с какими dll (ами) вы имеете дело.
Кроме того, в общем случае вам нужно больше, чем список указателей на аргументы и их размеры. Соглашение о вызовах вполне возможно зависит от типов параметров, а не только от размеров. Например, аргументы с плавающей точкой могут передаваться в регистрах FPU, а не в стеке.
Вам также нужно беспокоиться о типе возвращаемого значения и о том, что ожидает от него вызывающий код.