Учитывая C методы ++ какC# SWIG вектор <string> в строку []
std::vector<std::string> getFoo();
void setFoo(const std::vector<std::string> &foo);
Как я могу получить SWIG, чтобы выставить его, как это C#
string[] getFoo();
setFoo(string[] foo);
Я понимаю, что многие из people have asked о vector<string>
и SWIG, но я ничего не видел, обращаясь к конверсии в/из string[]
. Каждый упоминает, используя шаблоны Swig, как этого
%template(StringVector) vector<string>;
Но это только создает тип данных, который абоненты должны знать маршал вручную. В идеале, вызывающий абонент должен будет иметь дело только с string[]
, и пусть слой SWIG выберет его.
Как я могу просто использовать string[]
в C#, но он превращается в vector<string>
в C++?
Я чувствую, что это приносит в жертву немалую эффективность ради совместимости интерфейса. Опять же, я, вероятно, придумаю такую же идею. +1 – sehe
Я полагаю, что большинство людей, использующих интерфейс SWIG, действительно захотят 'string []', поэтому они все равно будут преобразовывать его вручную. Во всяком случае, одним из преимуществ этого подхода является то, что вы * можете * использовать StringVector напрямую, если бы эффективность имела значение. – paleozogt
Также обратите внимание, что это действительно будет работать только с compiletime. Вы не можете передать StringVector в какой-либо общий метод и все еще ожидаете, что он выполнит преобразование, определяемое пользователем (для этого нет ограничений типа generic). Хотя, C# 4.0 ''dynamic' мог бы его отключить (нужно проверить). – sehe