Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从DLL导出的函数中的RTTI 我有一个Visual Studio 2008 C++ + DLL,在这里我愿意接受可变数量的参数,并且知道每个类型的类型。例如: __declspec( dllexport ) void Foo( const char* object, const char* function, ... ) { printf( "%s::%s( ", object, function ); va_list list; va_start( list, function ); while( va_arg( list, ??? ) ) { printf( "[%s] %s ", type, value ); } va_end( list ); printf( " )\r\n" ); }_C++_Visual C++_Dll_Rtti - Fatal编程技术网

从DLL导出的函数中的RTTI 我有一个Visual Studio 2008 C++ + DLL,在这里我愿意接受可变数量的参数,并且知道每个类型的类型。例如: __declspec( dllexport ) void Foo( const char* object, const char* function, ... ) { printf( "%s::%s( ", object, function ); va_list list; va_start( list, function ); while( va_arg( list, ??? ) ) { printf( "[%s] %s ", type, value ); } va_end( list ); printf( " )\r\n" ); }

从DLL导出的函数中的RTTI 我有一个Visual Studio 2008 C++ + DLL,在这里我愿意接受可变数量的参数,并且知道每个类型的类型。例如: __declspec( dllexport ) void Foo( const char* object, const char* function, ... ) { printf( "%s::%s( ", object, function ); va_list list; va_start( list, function ); while( va_arg( list, ??? ) ) { printf( "[%s] %s ", type, value ); } va_end( list ); printf( " )\r\n" ); },c++,visual-c++,dll,rtti,C++,Visual C++,Dll,Rtti,预期用途如下所示: Buzz api; int a = 1; api.DoSomething( a, "hello", 0.2f ); Foo( "Buzz", "DoSomething", a, "hello", 0.2f ); Buzz::DoSomething( [int] 1, [const char*] "hello", [float] 0.2 ) 其中,预期输出如下所示: Buzz api; int a = 1; api.DoSomething( a, "hello", 0.2

预期用途如下所示:

Buzz api;
int a = 1;
api.DoSomething( a, "hello", 0.2f );

Foo( "Buzz", "DoSomething", a, "hello", 0.2f );
Buzz::DoSomething( [int] 1, [const char*] "hello", [float] 0.2 )
其中,预期输出如下所示:

Buzz api;
int a = 1;
api.DoSomething( a, "hello", 0.2f );

Foo( "Buzz", "DoSomething", a, "hello", 0.2f );
Buzz::DoSomething( [int] 1, [const char*] "hello", [float] 0.2 )
RTTI能做到这一点吗?如果一个可变参数的解决方案是不可能的(我怀疑它是不可能的),我同意一个包含多个重载的1-n参数

谢谢, PaulH

可变参数解决方案是可能的,但不是C方式,也不是当前版本的语言。但是,如果编译器实现可变模板,则可以使用它们来实现。通过使用一个包含一长串默认参数的函数,可以模拟当前版本的可变模板,最大值为任意值(如果使用预处理器魔术,则由变量设置)

因此,根据你想走哪条路,你需要学习可变模板和/或预处理器。一旦你做了必要的研究,前者就会变得显而易见。后者有点难,但如果你看一下src中的boost::function之类的东西,它就会变得很明显。

可变参数解决方案是可能的,但不是C方式,也不是当前版本的语言。但是,如果编译器实现可变模板,则可以使用它们来实现。通过使用一个包含一长串默认参数的函数,可以模拟当前版本的可变模板,最大值为任意值(如果使用预处理器魔术,则由变量设置)

因此,根据你想走哪条路,你需要学习可变模板和/或预处理器。一旦你做了必要的研究,前者就会变得显而易见。后者有点困难,但是如果你把SRC看成是像Boo::函数的话,它就会变得明显。

< P>第一:C语言风格的可变函数只支持C++,只与C代码兼容。不建议您在新的C++代码中使用它们,因为它们不能强制类型安全。 变量函数将其所有“…”参数作为非类型值在堆栈上传递,作为参数传递的值的类型必须由您(作为该函数的作者)放入您编写的函数中的逻辑推断。也就是说,唯一能告诉printf参数类型(格式字符串后面的参数)的就是格式字符串本身

<>这在C++中是真实的,就像在C.中一样,RTTI没有办法为栈上的任意值提供任何类型的信息。 如果这些值都是指向类层次结构中的对象(相关类的实例)的指针,那么您可以使用动态_转换来确定类型。。。但是,你必须编写代码来处理不同的类,语言不会为你这样做。

第一:C语言风格的变量函数在C++中支持,只与C代码兼容。不建议您在新的C++代码中使用它们,因为它们不能强制类型安全。 变量函数将其所有“…”参数作为非类型值在堆栈上传递,作为参数传递的值的类型必须由您(作为该函数的作者)放入您编写的函数中的逻辑推断。也就是说,唯一能告诉printf参数类型(格式字符串后面的参数)的就是格式字符串本身

<>这在C++中是真实的,就像在C.中一样,RTTI没有办法为栈上的任意值提供任何类型的信息。
如果这些值都是指向类层次结构中的对象(相关类的实例)的指针,那么您可以使用动态_转换来确定类型。。。但是您必须自己编写代码来处理不同的类,该语言不会为您这样做。

在DLL中不可能。。。没有模板的运行时实例化。。。在编译共享库时,你不知道什么是必要的。几乎所有我用过的C++ DLL都有用于开发的标题。在这些头文件中,有模板化的函数和类是非常常见的。仅仅因为没有将模板链接到DLL中,就没有理由不提及它们作为问题的解决方案。这孩子最近越来越学究气了!你最后的评论实际上是我想最终使用的解决方案。(即,包含一个带有DLL的C++包装器来执行实际RTTI工作)在DLL中是不可能的…没有模板的运行时实例化。。。在编译共享库时,你不知道什么是必要的。几乎所有我用过的C++ DLL都有用于开发的标题。在这些头文件中,有模板化的函数和类是非常常见的。仅仅因为没有将模板链接到DLL中,就没有理由不提及它们作为问题的解决方案。这孩子最近越来越学究气了!你最后的评论实际上是我想最终使用的解决方案。(包括一个带有DLL的C++包装器来执行实际RTTI工作)