从C访问c++模板
Accessing C++ templates from C
我使用OpenCV进行一些图像操作,它有几个函数必须给定数据类型才能正确执行。我的想法是模板化这些函数,这样我就不必为每种可能的数据类型编写单独的函数。
然而,代码我希望我写的代码与一些现有的C代码兼容,我有存储在内存中的图像,所以我可以更容易地传递它,而不需要不断地将图像写入光盘。
我遇到的问题是如何使我的。h文件和库让C程序调用c++模板函数。我还没有机会尝试它,但到目前为止,我所拥有的看起来像下面的东西:
foo。
int foo(int a, int, b);
float foo(float a, float b);
foo.c:
int foo(int a, int b) {
return footemp(a, b);
}
float foo(float a, float b) {
return footemp(a, b);
}
foo.hpp:
template<class t>
t footemp(t a, t b) {
return a + b;
}
这不起作用,因为它需要我的。c文件知道模板文件。所以我愿意听取建议。提前感谢您的帮助
这是可能的,但要小心。使用c++源文件foo.cpp
:
#include "foo.h"
#include "footemp.hpp"
int foo_int(int a, int b) {
return footemp(a, b);
}
float foo_float(float a, float b) {
return footemp(a, b);
}
在foo.h
中,使用extern "C"
进行C兼容声明,使用#ifdef
允许使用 C或c++:
#ifdef __cplusplus
extern "C" {
#endif
int foo_int(int a, int, b);
float foo_float(float a, float b);
#ifdef __cplusplus
}
#endif
将其编译为c++库-静态或动态,这无关紧要。在您的C源代码中,您现在可以按您的期望#include "foo.h"
和使用这些函数,只要您链接到库。
我认为你可以做的一件事是用c++编写函数,声明你想要的特化,同时定义extern "C"
函数来转发对模板函数的调用。
请记住,如果你用C来做其他的事情,你需要给函数起不同的名字;C语言不允许函数重载
正如mday299提到的,C语言中没有模板。然而,如果你的C代码包含在一个单独的编译单元(.exe/.dll)中,你可以为你的模板函数提供C接口,就像你做的那样:
foo。
/* C interface */
int fooInt(int a, int, b);
float fooFloat(float a, float b);
foo.hpp
template <class T> foo(T a,T b)
{
return a+b;
}
foo.cpp:
#include "foo.h"
#include "foo.hpp"
int fooInt(int a, int b) {
return foo<int>(a, b);
}
float fooFloat(float a, float b) {
return foo<float>(a, b);
}
然后,项目将使用c++单独编译,c部分将只看到foo.h和lib/dll文件
C中没有模板。这是c++的一个特性。对不起。
您很有可能使用c++编译器编译C文件。因此,您可以使用c++编译器构建整个项目,包括C和c++源。
你已经用c++编译器编译了它,否则你将无法编译你的重载foo函数
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数