2013-04-12 2 views
2

Я использую OpenCV для некоторых манипуляций с изображениями, и у него есть несколько функций, которым должен быть задан тип данных для правильной работы. Моя идея заключается в шаблоне этих функций, поэтому мне не нужно писать отдельную функцию для каждого возможного типа данных, которым она могла бы быть.Доступ к шаблонам C++ из C

Однако код, который я бы хотел, чтобы код, который я пишу, был совместим с каким-либо существующим кодом C, который у меня есть, хранит изображения в памяти, поэтому я могу легко его упростить, не записывая изображение на диск постоянно.

Проблема, с которой я столкнулся, заключается в том, как сделать мои файлы .h и библиотеки, чтобы программа C вызывала функции шаблона C++. У меня не было возможности попробовать еще, но до сих пор, что я хотел бы посмотреть что-то, что следует:

foo.h

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-файл знал о шаблоном файле. Итак, я открыт для предложений. Заранее благодарю за помощь

+2

Также нет перегрузки в C. – dyp

ответ

2

Нет шаблонов в C. Это функция C++. Сожалею.

1

Существует хорошая вероятность, что вы сможете скомпилировать ваш файл C с помощью компилятора C++. Таким образом, вы можете построить весь проект, как C, так и C++, с помощью компилятора C++.

Вы уже компилируете его с помощью компилятора C++, иначе вы не сможете скомпилировать свои перегруженные функции foo.

+1

C++ - это почти надмножество C. Если вы можете просто скомпилировать ваши .c-файлы как C++ (может потребоваться специальный флаг компилятора или переименовать их в .cpp/xx/c), который, вероятно, был бы самым простым. – John

1

Я предполагаю, что одна вещь, которую вы могли бы сделать, это написать функцию в C++, объявить нужные вам специализации и в то же время определить функции extern "C", которые перенаправляют вызовы на функции шаблона.

Имейте в виду, если вы используете C для других вещей, вам нужно будет назвать функции разными; C не выполняет перегрузки функций.

4

Это возможно, с некоторой осторожностью. Используйте источник 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 

Compile это как библиотека C++ - статическая или динамическая, это не имеет значения. В ваших источниках C вы можете теперь #include "foo.h" и использовать эти функции, как и следовало ожидать, до тех пор, пока вы связываетесь с библиотекой.

2

Как указано в mday299, шаблонов нет C. Однако, если ваш C-код содержится в блоке компиляции saparate (.exe/.dll), вы можете предоставить интерфейс C для своих функций шаблона почти так, как вы делали it:

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++, и с частью будет видеть только foo.h и Лив/dll

Смежные вопросы