gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:59:10 25 4
gpt4 key购买 nike

我正在尝试创建一个共享库来公开一些 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. 还有其他更好的想法吗?

最佳答案

你有点卡住了,因为 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)

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

关于c++ - 从共享库公开 C++ 模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13152128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com