3

コンストラクターが取るテンプレートクラスを実装するとき:

  1. 関数のベクトル (関数の型はstd::function<bool(const T&)>)
  2. std::binary_function<bool,bool,bool>1) から特定の値までベクトルを適用した結果を累積するために使用します。

std::plus()andを 2 番目のテンプレート パラメーターとして使用できるようにしたいのですstd::multiplies()が、関数によっては、対応するニュートラル要素が必要になるという問題があります (std の初期値を蓄積するため)。AND( std::multiplies)についてはtrue(別名1)、OR( ) については(別名)std::plusが必要です。テンプレートを特殊化して問題を解決できることはわかっていますが、組み込みのSTL関数の中立要素を取得する方法があるのだろうかと思います。false0

4

3 に答える 3

4

ここでの通常の解決策は特性です。テンプレートをインスタンス化するのではなく、 forstd::plusを定義するtraitsクラスに加えて、アイデンティティ要素(static const、初期化子を使用)、およびその他の必要なものをインスタンス化します。何かのようなもの:typedefstd::plus

struct OpTraitsAdd
{
    typedef std::plus<int> Op;
    static int const identity = 0;
};

struct OpTraitsMult
{
    typedef std::multiplies<int> Op;
    static int const identity = 1;
};

明示的な特殊化を使用して、標準の演算子から特性を取得することもできます。

template <typename Op> struct OpTraits;
template<>
struct OpTraits<std::plus<int> >
{
    static int const identity = 0;
};
template<>
struct OpTraits<std::multiplies<int> >
{
    static int const identity = 1;
};

この場合、演算子を介してクラスをインスタンス化し、必要に応じて使用OpTraits<Op>::identityします。

もちろん、どちらの場合も、独立したクラスまたはテンプレートの特殊化として、必要なすべての特性を提供する必要があります。必要なID要素が0と1の2つだけの場合は、次のような方法で自動的に実行できる可能性があります。

template <bool idIs0> struct IdImpl;
template<>
struct IdImpl<false>
{
    static int value = 1;
};
template<>
struct IdImpl<true>
{
    static int value = 0;
};

template <typename Op>
struct Id
{
    static int value = ItImpl<Op(1, 0) == 1>::value;
};

は一定のepxressionではないため、これはC++11より前では機能しません。Op(1, 0)C++11についてはよくわかりません。Op::operator()しかし、宣言されていれば、うまくconstexprいくはずだと思います 。(クライアントが提供する可能性のあるものも含めて、多くのオペレーターをカバーする必要がある場合にのみ、わざわざ試してみました。)

于 2012-10-17T09:17:10.050 に答える
3

ジェームズの答え(およびそれに対する私のコメント)から1つのポイントを選択するだけです。分けて考えるべきだと思います。

必要に応じて、ID が実際に存在すると仮定して、実行時に ID を計算できます。です!func(true, false)

と の場合とfunc::operator()同様に、 が利用可能で副作用がない場合、おそらく適切なコンパイラはコンパイル時に実際にそれを計算します。ただし、コンパイル時に値を必要としないため、コンパイル時に実際の累積操作を知る必要なく、(呼び出し元が必要な場合) テンプレートで a を受け入れることができます。std::plusstd::multipliesstd::function<bool(bool,bool)>

于 2012-10-17T09:32:50.227 に答える