我正在开发一个C ++ / CLI库,我有以下类:
public ref class AbstractClassA abstract{
protected:
// signature can be changed by me (method will be overriden in C#)
virtual void write(String ^ str, String ^ format, ...array<Object^> ^args) = 0;
internal:
// signature cannot be changed by me
void internWrite(const char *str, const char *format, va_list args){
write(gcnew String(str), gcnew String(format), ???)}
};
方法' internWrite '必须调用方法' methodA ',但我无法找到如何转换' va_list '托管数组的参数。 我找到了一些有趣的帖子[1],[2]但是提到的解决方案需要有' va_list '长度。我没有这些信息,也无法更改' internWrite '的签名。
我可以更改'写'的签名。
如何将va_list转换为托管变量args数组?
[编辑] 方法' internWrite '的注释提及:
-format + args:格式化打印,与printf函数相同的语法
也许我需要使用参数' format '来获取va_list的长度(如length of va_list when using variable list arguments?所述)。但是我该怎么做呢? printf命令如何做到这一点?
[编辑]假设格式+ args与printf具有相同的语法,我创建了一种方法来获得agrs的长度(通过计算'%')。 这是我目前的代码:
void write(char *format, va_list args){
String^ mgFormat = gcnew String(format);
int nbArgs = sizeOfArgs(format);
array<Object^>^ mgArgs = gcnew array<Object^>(nbArgs);
va_start(args, format);
for (int _i = 0; _i < nbArgs; ++_i){
mgArgs[_i] = va_arg(args, int); // not sure the type is int ... how to know ?
}
va_end(args);
internWrite(mgFormat, mgArgs);
}
但现在我不得不将每个arg对象添加到数组中,因为宏'va_arg'需要当前参数的类型。我没有这个信息。如何迭代va_list并填充我的托管数组?
[1] How do I pass variable arguments from managed to unmanaged with a C++/CLI Wrapper?
[2] Calling a .NET function with variable number of parameters from unmanaged code
答案 0 :(得分:0)