1

我正在尝试创建一个共享库来公开一些 c++ 方法。

我只是创建了一个包装器,在其中我使用外部“C”链接将方法公开为 C 函数。

在相应的 C 函数中,我创建了一个类的对象并调用了适当的方法。

我遇到的问题是一些需要公开的方法使用模板作为参数。

例如:C++:

class myclass {
    template <typename T>
    void write(int addr, T data);
    void get_data()
}

C包装:

void get_date() {
    myclass obj;
    obj.get_data();
}

我应该如何公开其他方法?

  1. 我可以在 C 包装函数中使用 typeid 运算符来确定参数的类型吗?
  2. 对此还有其他更好的想法吗?
4

1 回答 1

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)

这意味着使用错误数量的参数应该会产生错误。

于 2012-10-31T06:29:34.353 回答