我有一个C ++函数,它接受std::string&
并且在此函数中更改了字符串。
我有一个传递System::String^%
的CLR函数。我希望能够将CLR字符串跟踪引用传递给C ++函数并相应地进行更改。
到目前为止,我有类似的东西,但看起来很难看:
void test(System::String^% x)
{
pin_ptr<System::String^> x_ptr = &x;
std::string x_cpp = msclr::interop::marshal_as<std::string>(*x_ptr);
x_cpp = "qwerty"; //in real code this string is passed to function and changed
x = gcnew System::String(x_cpp.c_str());
}
有更优雅的方法吗?
答案 0 :(得分:2)
对于第一种方式:由于marshal_as
方法被声明为采用System::String^ const &
,因此您无法直接传递跟踪引用。 (如果你可以做一个演员,我无法弄明白它会是什么。)但是,你可以将x
复制到常规局部变量,并将其传递给marshal_as
。这消除了pin_ptr,这是一件好事。
对于第二种:对第二次转换使用与第一次转换相同的转换方法。除非您有特殊原因以不同方式执行此操作,否则marshal_as
可能是处理这些转换的最佳方式。
void otherFunction(std::string& x_cpp)
{
x_cpp = "qwerty";
}
void test(System::String^% x)
{
System::String^ x_not_tracking_ref = x;
std::string x_cpp = msclr::interop::marshal_as<std::string>(x_not_tracking_ref);
otherFunction(x_cpp);
x = msclr::interop::marshal_as<System::String^>(x_cpp);
}
int main(array<System::String ^> ^args)
{
System::String^ foo = "asdfgh";
Debug::WriteLine(foo);
test(foo);
Debug::WriteLine(foo);
return 0;
}
输出:
asdfgh qwerty
答案 1 :(得分:0)
基本上,我不这么认为。我倾向于尝试尽快释放pin_ptr。如下所示:
std::string string_from_string(System::String^% x)
{
pin_ptr<System::String^> x_ptr = &x;
return msclr::interop::marshal_as<std::string>(*x_ptr);
}
void test(System::String^% x)
{
auto x_cpp = string_from_string(x);
x_cpp = "qwerty";//in real code this string is passed to function and changed
x = gcnew System::String(x_cpp.c_str());
}
(名称和语法都是近似的。你可能想要反向写一个string_from_string。