C++ 将模板实例化导出为C函数

C++ 将模板实例化导出为C函数,c++,c,templates,c++11,shared-libraries,C++,C,Templates,C++11,Shared Libraries,我正在为C库创建Haskell绑定。但是,我想将库的调用约定调整为更适合Haskell的方式,因此我创建了一个模板类,它有一个静态方法,当您以以下方式使用它时,它会调用正确的方法: Wrap<decltype(&libraryFunction), &libraryFunction>::call(...); Wrap::call(…); 其中,…表示参数。这太棒了,编译器显然已经为我生成了包装器代码。我甚至可以使用&操作符获取此函数的地址,因此它显然只是一个常规函数

我正在为C库创建Haskell绑定。但是,我想将库的调用约定调整为更适合Haskell的方式,因此我创建了一个模板类,它有一个静态方法,当您以以下方式使用它时,它会调用正确的方法:

Wrap<decltype(&libraryFunction), &libraryFunction>::call(...);
Wrap::call(…);
其中,
表示参数。这太棒了,编译器显然已经为我生成了包装器代码。我甚至可以使用
&
操作符获取此函数的地址,因此它显然只是一个常规函数

<> P.>但是,Haskell不能使用C++模板,所以我想做的是显式地实例化这个模板以获得所需的函数,并将它们导出为正则C函数,我可以从Haskell中引用。我知道我可以制作存根来手动调用这个静态成员函数,但我真的不喜欢这样


有什么办法吗?便携式或非便携式,我想知道这是否可行。

这不能通过便携式完成:

[temp]/4

模板、模板显式专门化和类模板部分专门化不应具有C链接

注意,这也阻止了您使用该函数的指针,让Haskell通过这个指针调用函数:不能保证,例如C++函数的调用约定(C++程序中的调用约定)与Haskell假定的函数指针相同。 <> P>可以导出一个在C和C++语言链接之间转换的单个<代码>外部“C”< /代码>函数。您可以将函数指针或其他类型的标识符传递给Haskell,Haskell通过传递其实际要调用的函数的标识符来调用此C函数:

std::map<int, void(*)(int32_t)> functions;

extern "C" interface_fct(int id, int32_t arg)
{
    functions[id](arg);
}
std::map函数;
外部“C”接口(int id,int32参数)
{
函数[id](arg);
}
当然,这对于具有不同参数集的函数不是很有用


您可以编写类似于
va_args
(但更安全)的内容来传递任意参数,但编写不可移植的内容可能更有用。

函数的名称是什么?您是否尝试过
extern“C”
?@Jarod42:我希望能够根据需要命名导出的函数。“并将它们导出为我可以从Haskell引用的常规C函数”然后您需要一个常规C名称,而不是带有某种损坏的