gpt4 book ai didi

c++ - 是否允许将指向模板函数的指针传递给 C 库? (作为回调)

转载 作者:行者123 更新时间:2023-12-01 11:54:44 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Calling function template specialization using C calling conventions

(3 个回答)


2年前关闭。




考虑以下代码:

#include <iostream>

struct Foo {
void work() { std::cout << "foo" << std::endl; }
};

typedef void function_type(void *arg);

template <typename T>
void function(void *arg)
{
auto &t = *reinterpret_cast<T*>(arg);
t.work();
}

void call_function(function_type *fn, void *arg)
{
fn(arg);
}

int main()
{
Foo foo;

call_function(&function<Foo>, &foo);

return 0;
}

如果 call_function() 是某个 C 库的接口(interface)(动态链接到我的程序),是否可以将指针传递给模板函数的某个特定实例?指向模板函数(实例化)的指针和常规函数之间有什么区别吗?

最佳答案

如图所示代码中,两个函数都有C++语言联动,一切正常。您没有传递模板函数,而是传递了从函数模板实例化的常规函数​​。

一旦任何模板被实例化,它就不再是一个真正的模板,就像实例化一个类给你一个对象,而不是另一个类一样。

但是缺少一些东西 - 要链接 C 程序,您需要将接口(interface)导入为 extern "C"并将该链接用于传递给它的任何函数指针。否则 C 和 C++ 双方可能会在使用的调用约定上存在分歧,一切都会出错。

由于标准明确规定

A template, a template explicit specialization, and a class template partial specialization shall not have C linkage



我们需要一些解决方法。像往常一样,您的 C 回调带有一个参数,因此没有什么可以阻止您在 C 链接蹦床函数中切换调用约定:
extern "C" {
void bounce(void *arg)
{
static_cast<Trampoline *>(arg)->callback();
}
}

在哪里 callback将是一个普通的 C++ 链接函数,包括一个函数模板实例化(或只是一个 std::function 或其他)。

关于c++ - 是否允许将指向模板函数的指针传递给 C 库? (作为回调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501475/

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