从共享库中公开C ++模板方法

时间:2012-10-31 06:06:18

标签: c++ templates

我正在尝试创建一个共享库来公开一些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();
}

我应该如何揭露其他方法?

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

1 个答案:

答案 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)

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

相关问题