我正在尝试创建一个共享库来公开一些c ++方法。
我只是创建一个包装器,在其中我使用extern“C”链接将方法公开为C函数。
在相应的C函数中,我创建了一个类的对象并调用适当的方法。
我遇到的问题是需要公开的一些方法使用模板作为参数。
E.g。 : C ++:
class myclass {
template <typename T>
void write(int addr, T data);
void get_data()
}
C包装器:
void get_date() {
myclass obj;
obj.get_data();
}
我应该如何揭露其他方法?
答案 0 :(得分:3)
由于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.
}
}
最后一个选择是使用var args函数做一些技巧:
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)
这意味着使用错误数量的参数会产生错误。