Как уже говорили другие, вы должны обернуть функции в копию и затем обратно из буфера в стиле C. Это решение, использующее объект-оболочку с коротким сроком службы, делает это довольно элегантно:
using namespace std;
class Wrap {
public:
Wrap(string &S,int Length):Buffer(Length),Orig(S)
{ //constructor copies the string to the buffer
copy(Orig.begin(),Orig.end(),&Buffer[0]);
cout<<"Construct\n";
}
~Wrap()
{ //destructor copies the buffer contents back to the string
Orig=&Buffer[0];
cout<<"Destruct\n";
}
operator char*() { return &Buffer[0]; }
vector<char> Buffer;
string &Orig;
};
void Func(char *T) //a typical C-Style function that modifies the string
{
cout<<"Function\n";
*(T+1)='Q';
*(T+2)='Q';
}
int main()
{
string X("Hiya");
Func(Wrap(X,20)); //Call the function with a wrapped string
cout<<X; //output the modified string
}
ЭтоВывод кода:
Construct
Function
Destruct
HQQa
, который демонстрирует, как и как это работает.Это не решает проблему, связанную с указанием длины буфера, но позволяет вызываемой функции изменять длину и содержимое строки (до указанного размера буфера).