2

一部の画像操作にOpenCVを使用していますが、正しく実行するにはデータ型を指定する必要がある関数がいくつかあります。私の考えは、これらの関数をテンプレート化することです。そのため、可能なデータ型ごとに個別の関数を記述する必要はありません。

ただし、私が書いているコードは、イメージをメモリに保存する既存の 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ファイルが必要なため、これは機能しません。だから私は提案にオープンです。助けてくれてありがとう

4

5 に答える 5

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

これを C++ ライブラリとしてコンパイルします (静的か動的かは関係ありません)。C ソース#include "foo.h"では、ライブラリに対してリンクする限り、期待どおりにこれらの関数を使用できるようになりました。

于 2013-04-12T22:17:29.287 に答える
2

C にはテンプレートはありません。これは C++ の機能です。ごめん。

于 2013-04-12T22:10:46.793 に答える
2

mday299 が述べたように、C にはテンプレートはありません。ただし、C コードが別のコンパイル ユニット (.exe/.dll) に含まれている場合は、テンプレート関数にほとんど同じように C インターフェイスを提供できます。

foo.h

/* 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 ファイルのみを参照します。

于 2013-04-12T22:19:20.950 に答える
1

C ファイルを C++ コンパイラでコンパイルできる可能性は十分にあります。そのため、C++ コンパイラを使用して、C ソースと C++ ソースの両方でプロジェクト全体をビルドできます。

すでに C++ コンパイラでコンパイルしています。そうしないと、オーバーロードされた foo 関数をコンパイルできません。

于 2013-04-12T22:15:36.313 に答える
1

できることの 1 つは、関数を C++ で記述し、必要な特殊化を宣言し、同時にextern "C"、呼び出しをテンプレート関数に転送する関数を定義することだと思います。

他のものに C を使用している場合は、関数に別の名前を付ける必要があることに注意してください。C は関数のオーバーロードを行いません。

于 2013-04-12T22:15:44.967 に答える