Можно ли использовать шаблоны Variadi c в сочетании со смешанным кодом? - PullRequest
0 голосов
/ 26 мая 2020

Я попытался преобразовать 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 .)

Мы будем благодарны за любые советы или объяснения.

...