1

C ++ 11またはブーストなし:(

次のシグネチャを持つ関数があります。

template<class INPUT_ITR, class OUTPUT_ITR>
void DoWork(const INPUT_ITR in_it, const INPUT_ITR in_it_end, OUTPUT_ITR out_it, OUTPUT_ITR out_it_end, CONTEXT_DATA)

通常、入力と出力の間で複雑な処理が行われますが、場合によってはノーオペレーションが必要な場合があり、データは単純にコピーされます。入力データ型と出力データ型が同じ場合、関数はインプレース操作をサポートします。だから私はこのコードを持っています。

    if (NoOp)
    {
        if (in_it != out_it)
        {
            copy(in_it, in_it_end, out_it);
        }
    }

インプレース操作 (反復子チェック) が要求された場合、データをコピーする必要はありません。

これは、さまざまなデータ型 (たとえば、int32 から int64) へのイテレータを使用して関数を呼び出すまではうまくいきました。次に、互換性のない型であるため、反復子チェックについて不平を言います。

error C2679: binary '!=' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<unsigned __int64>>>

これは私を少し困惑させました。データ型が同じ場合はこのチェックを実行する簡単な方法はありますが、型が異なる場合はコピーを実行するだけですか?

ありがとう

4

3 に答える 3

1

私は回避策を思いつきました。より良い提案を歓迎します。

関数をオーバーロードして、インプレース バージョンを提供します。今すぐインプレースを要求するかどうかはユーザー次第です (古い関数を使用したインプレースは、操作がない場合に冗長コピーを実行します)。

template<class ITR>
void DoWork(const ITR it, const ITR it_end, CONTEXT_DATA)
{
    if (! NoOp)
    {
        DoWork(it, it_end, it, it_end, sSourceSpec, sDestSpec);
    }
}
于 2013-08-28T11:52:48.293 に答える