Я попытался преобразовать c -стилевую функцию c с помощью «va_list», например:
extern bool ForwardInformation(unsigned int id, va_list* args); // impl. in a library
bool Information(unsigned int id, ...) {
bool sig{};
va_list args;
va_start (args, id);
sig = ForwardInformation(id, &args);
va_end(args);
return sig;\
}
в вариационный шаблон c (используя C ++ 17 в Visual- Studio)
template<typename... Args>
static auto Information(unsigned int id, Args&&... args) -> bool {
return ForwardInformation(id, std::forward<Args>(args)...);
}
Это отлично работает для всех модулей , кроме тех, которые используют смешанный режим .
Я получаю следующие ошибки:
bool Information<LPCSTR,System::String^&>(unsigned int,LPCSTR &&,System::String ^&)': cannot convert argument 3 from 'System::String ^' to 'System::String ^&'
file.cpp(102): note: An object from the gc heap (member of a managed class) cannot be converted to a native reference
error C2672: 'Information': no matching overloaded function found
error C2893: Failed to specialize function template 'bool Information(unsigned int,Args &&...)'
note: With the following template arguments:
note: 'Args={System::String ^, System::String ^}'
Я понимаю ошибки, но не знаю, что изменить, чтобы они заработали.
Я даже не знаю, должно ли это работать в такой комбинации. Я думаю, здесь нет никакого отношения к смешиванию управляемого и неуправляемого кода, потому что c -impl. с va_list работал (хотя я думаю, что impl. находился в блоке "#pragma unmanaged", который я тоже не могу использовать с шаблоном, потому что я нахожусь в заголовке класса, а не в самом файле cpp .)
Мы будем благодарны за любые советы или объяснения.