Прежде всего, auto
не является динамическим типом в C ++. Ключевое слово auto
является своего рода заполнителем для вывода компилятором:
// int i1 = 0; // same thing in the eyes of the compiler
auto i1 = 0;
Но компилятор выводит типы только тогда, когда он инициализируется значением.
// ???? i2;
// i2 = 0;
auto i2; // error! deduce what type?
i2 = 0; // cannot call operator= with unknown type
Но вы можете иметь auto
в лямбда-типе, что там отличается?
// type of `lambda` is an unnamed type.
auto lambda = [](auto var) { std::cout << var; };
lambda(1);
lambda("string");
Даже если это выглядит динамично, не так ли? Общая лямбда реализована с использованием шаблона:
// v----- unnamed
struct {
template<typename T>
auto operator()(auto var) const {
std::cout << var;
}
} lambda{};
Это означает, что компилятор сгенерирует новый статический код на лету для параметра auto
. Что значит, даже если вы обновились до C ++ 20, что позволяет:
auto CreateVariable(auto value) {
// ...
}
На самом деле никакой функции не существует. Это просто шаблон, ожидающий реализации.
Не будет функции для экспорта из вашей dll, так как это будут только некоторые шаблоны.
То, что вы ищете, выглядит примерно так:
struct CSharpObject;
auto CreateVariable(CSharpObject* value) -> CSharpObject* {
// reflect on value to check the type
// construct a new instance of CSharpObject with the
// right set of metadata for c# to understand
}
К сожалению, C ++ не понимает динамический, отражаемый и собираемый мусор объект C #, а C # не понимает статическую природу типов шаблонов и значений C ++.
Вам потребуется предоставить набор функций, которые работают с набором известных типов:
auto CreateVariableInt(int value) -> int* {
return new int{value};
}
auto GetVariableInt(int* address) -> int {
return *addr;
}
auto CreateVariableDouble(double value) -> double* {
return new double{value};
}
auto CreateVariableDouble(double* address) -> double {
return *address;
}
// so on and so forth for every supported types.
Затем на стороне C # сохраните метаданные о том, какой тип содержится, и вызовите нужную функцию.