5

次のような通常のテンプレートの特殊化:

template<class T>
class C
{
    void common() { ... }
    void f2 = delete;
};

template<>
class C<int>
{
    void common() { ... }
    void f1() { ... }
};

次のように表すことができますstatic_if

template<class T>
class C
{
    void common() { ... }

    static_if(std::is_same<T, int>::value)
    {
        void f1( ) { ... }
    }
    else
    {
        void f2( ) = delete;
    }
}

これらは直接競合する機能ですか? テンプレートの特殊化でstatic_ifできないことはできますか? static_ifテンプレートの特殊化でできることはすべてできるようです。

余談ですがstatic_if、このコンテキストはあまり好きではありません。これは、特定の状況でインターフェイスのどの部分を使用できるかがわかりにくくなる可能性があるためです。場合によっては、テンプレートの特殊化により、より明確な構文が提供される可能性があります。

4

6 に答える 6

10

static ifあなたにとって役に立たないことの1つは、テンプレートの特殊化を使用する「主要な」方法です-1つの場所で一般的な動作を提供し、コードのユーザーが特定のニーズ/データ型/などに合わせてオーバーライド(=特殊化)できるようにします。 ..

于 2012-08-22T20:56:04.103 に答える
4

いいえ、 static_if は明示的なテンプレートの特殊化を廃止しません。明示的なテンプレートの特殊化は、static_if よりも強力な機能であり、static_if が意図していない多くの機能を提供します。static_if は、特定のものを表現するためのより便利で読みやすい方法です。

static_if は、クラスが継承する基本クラスの変更など、明示的なテンプレートの特殊化ができる特定のことを実行できません。

struct S {};

template<typename T>
struct T
  static_if(is_same<T,int>::value) { : S }  // ?
{ };

template<typename T>
struct T {};

template<>
struct T<int> : S {};
于 2012-08-22T21:11:02.417 に答える
2

If は分岐に関するものです。専門はマッチングです。一方が他方より優れている場合もあります。

以下は、Alexandrescu のModern C++ Design 、セクション 11.9、「マルチメソッド」からの直接の例です: に基づく複雑なクラス階層があり、Shape仮想継承と非仮想継承があるとします。階層のメンバー間でできるだけ効率的にキャストできるようにしたいと考えています。仮想ベースには が必要なので、それを許可する必要がありますが、可能な限りdynamic_cast許可したいと考えています。static_castキャスト ポリシーによる解決策:

template <typename To, typename From> struct ShapeCaster
{ 
    static To & cast(From & x) { return dynamic_cast<To&>(x); }
};

template <> struct ShapeCaster<Triangle, Shape>
{
    static Triangle & cast(Shape & x) { return static_cast<Triangle&>(x); }
};

template <typename To, typename From> To & shape_cast(From & x)
{
    return ShapeCaster<To, From>::cast(x);
}

ヒエラルキー内のどこに移動していても、次のように言えます。

To & y = shape_cast<To>::cast(x);

最も効率的なキャストが得られ、ポリシーを簡単に拡張できます。

これを一連のifs で書くと、読みにくくなります。

于 2012-08-22T21:07:17.163 に答える
1

このstatic if機能はまだ標準化されていません。さて、関連する問題が解決されて標準になり、すべてのコンパイラがそれをサポートすると仮定すると、それはツールセットのツールの 1 つにすぎません。

特殊化によってコードが読みやすく保守しやすくなるさまざまなケースを想像できますが、これらのすべてのケースで、特殊化は依然として進むべき道です。の最大の利点は、さまざまな特殊static if化からコードをインターリーブできることですが、複数の単純な特殊化を使用する代わりに、条件付きでコンパイル/無視される巨大なコードの塊になってしまう可能性があるため、これは欠点にもなり得ることに注意してください。

于 2012-08-22T20:41:32.643 に答える
0

はいと思います。static_if特に、定義全体ではなく、クラスのごく一部を特殊化する必要がある場合は、テンプレートの特殊化よりもはるかに強力です。スペシャライゼーションが優れている唯一のケース-スペシャライズされた実装がメインテンプレート/他のスペシャライゼーションと根本的に異なる場合。

于 2012-08-22T20:44:21.753 に答える