C++ 暴露C++;共享库中的模板方法
我试图创建一个共享库来公开一些C++方法。 我只是创建一个包装器,在其中使用外部“C”链接将方法公开为C函数 在相应的C函数中,我创建了类的一个对象,并调用了相应的方法 我遇到的问题是一些需要公开的方法使用模板作为参数 例如: C++:< /P> 我应该如何公开另一种方法C++ 暴露C++;共享库中的模板方法,c++,templates,C++,Templates,我试图创建一个共享库来公开一些C++方法。 我只是创建一个包装器,在其中使用外部“C”链接将方法公开为C函数 在相应的C函数中,我创建了类的一个对象,并调用了相应的方法 我遇到的问题是一些需要公开的方法使用模板作为参数 例如: C++:< /P> 我应该如何公开另一种方法 我可以在C包装函数中使用typeid运算符来确定参数的类型吗 还有其他更好的主意吗 由于C不支持模板或typeid,您有点被卡住了 我能想到的最好/最简单的方法是为您希望使用的每个参数类型创建一个C函数版本 void writ
由于C不支持模板或typeid,您有点被卡住了 我能想到的最好/最简单的方法是为您希望使用的每个参数类型创建一个C函数版本
void write_int( int i )
{
myclass obj;
obj.write(i);
}
void write_string( char * s )
{
myclass obj;
obj.write(s);
}
另一个选项可能是打开类型并传递void*指针
void write( int type, void* ptr )
{
myclass obj;
switch(type)
{
case C_INT:
obj.write( *static_cast<int*>(ptr) );
break;
case C_STR:
obj.write( *static_cast<char**>(ptr) );
break;
default:
//Some kind of error.
}
}
您可以通过定义隐藏函数的宏来检测此函数中的某些使用错误:
#define write(X,Y) write(X,Y)
这意味着使用错误数量的参数会产生错误。模板不是C的一部分-请只使用相关的标记。我已经通过传递一个空指针使用了选项2。但是希望避免多次调用函数的开销。
obj.write
函数在每次调用包装器write
函数时只调用一次。然而,在void write( int type, void* ptr )
{
myclass obj;
switch(type)
{
case C_INT:
obj.write( *static_cast<int*>(ptr) );
break;
case C_STR:
obj.write( *static_cast<char**>(ptr) );
break;
default:
//Some kind of error.
}
}
void write( int type, ... )
{
va_list argp;
va_start( argp, type);
myclass obj;
switch(type)
{
case C_INT:
obj.write( va_arg(argp, int) );
break;
case C_STR:
obj.write( va_arg(argp, char* ) );
break;
default:
//Some kind of error.
}
}
#define write(X,Y) write(X,Y)