3

CライブラリにC++フロントエンドを追加しています。このライブラリの1つの関数は、配列を持つハンドラーと配列のサイズを持つ整数を呼び出します。したがって、C関数を提供する必要があります。

int handler(int argc, sometype **argv);

ここで、C ++呼び出しコードが、次のような、よりC++風のハンドラー関数を提供できるようにしたいと思います。

int handler(std::vector<sometype*> args);

ハンドラータイプの変更は難しくありませんhandler。ユーザー提供のハンドラーを呼び出す独自のハンドラーを提供する必要があります。std::vectorそのため、を作成してその内容をコピーする必要がありますargv

ただし、可能であれば、ポインタのリスト全体をコピーしたくはありません。残念ながら、内部配列にすでに割り当てられているメモリブロックを使用するように指示することはできないと思います。std::vectorさらに、配列は静的であるため、考慮する必要がありますconst

std::vector事前に割り当てられたCスタイルの配列をより使いやすいインターフェイスでラップするために使用できるものと同様のSTLタイプはありますか?と同様に、サイズクエリと反復をサポートする必要がありますstd::vector

ありがとう。

4

4 に答える 4

1

関数がコンテナーの代わりにイテレーターのペアを取ることを考えたことはありますか? テンプレート関数にする必要があるので、それがうまく機能しない理由は理解できますが、配列を渡すことができます。

template<typename I>
int handler(I begin, I end);

handler(argv, &argv[argc]);

これはまだ完全な解決策ではありませんが、少し一般的になり、既存の配列を使用できるようになります。

于 2012-09-06T16:39:31.637 に答える
1

あなたが何を求めているのかは定かではありませんが、この関数プロトタイプが与えられた場合

int handler(int argc, const sometype *const *argv);

C++ ラッパーを作成します。

int handler(const std::vector<sometype*>& arg) 
{return handler(arg.size(), &arg[0]);} //no copies

template<class const_iterator>
int handler(const_iterator begin, const_iterator end) //can pass any structure
{return handler(std::distance(begin, end), &*begin);} //no copies

この API を C++ で実装する方法は次のとおりです。

int handler(int argc, const sometype *const*argv) {
    const std::vector<const sometype*> arg(argv, argv+argc); //this will copy the pointers
    //stuff
}

残念ながら、既存の配列をベクトルに取得する方法はありませんが、いくつかのポインターをコピーするのは本当に遅いのでしょうか?

コンパイルの証明: http://ideone.com/BkSVd

于 2012-09-06T16:41:21.803 に答える
0

これらのポインター要素によって参照されるデータの型は何ですか?

これらのポインター要素の所有者は誰ですか。つまり、これらの要素はコレクション/データ構造によって参照されているだけですか、それともそのコレクションがそれらのアイテムの割り当て、割り当て解除を担当していますか?

それらのアイテムは同じタイプまたは同じサイズですか?

たとえば、異なるサイズの文字の配列や、基本クラスは異なるが共通の祖先から派生したオブジェクトなどです。

これらすべてのトピックは、どのライブラリー、オブジェクト指向かどうか、およびどのデータ構造またはコレクションを使用するかを決定するために考慮される可能性があります。

std と Boost は、最初にルックアップするための最初のオプションであるべきです。ただし、独自のコレクションを作成する必要がある場合もあります。

あなたのライブラリは、配列よりもインデックス可能なリストの概念のようなものを必要とするようですが、交換可能である場合もあります。

乾杯。

于 2012-09-06T16:45:10.027 に答える
0

::vector について知っているなら、::array について調べたことがあると思います。

http://www.cplusplus.com/reference/stl/array/

ただし、主な問題 - オブジェクトを既存のメモリにオーバーレイする - は、単純なパケット スニファーを思い起こさせます。つまり、オブジェクト構造を作成し、その参照を既知のデータに移動してオーバーレイします。あなたの問題でこれを行うことができるかどうかはわかりませんが、それが最初に検討する方法です。

注: std::array がどのように配置されているか正確にはわかりませんので、実装が難しいことは明らかです:/

于 2012-09-06T16:24:55.820 に答える