3

次のように宣言されている構造体がどこかで使用されています。

struct Foo
{
someArray[64];
//...other stuff
};

多くの場所で広く使用されているため、次のように変更したいと思います。

template <size_t N = 64>
struct Foo
{
someArray[N];
//...other stuff
};

正確さのために、この構造体を 128 バイト配列で使用する必要がある場所が 1 つ (正確には 4 つ) あるためですが、他のすべての使用に対して導入されるペナルティは支払う価値がありません。デフォルトのテンプレート引数を提供する際に、それが透過的に通過することを望んでいましたFoo<128>. 残念ながら、それを使用するたびにFoo<>. これを回避する方法はありますか?

4

3 に答える 3

4

クラス テンプレートをインスタンス化するときは、角かっこを省略できません。

ただし、Fooクラス テンプレートに別の名前 (たとえばFooN) を付けてから、次のような型エイリアスを指定できます。

typedef FooN<> Foo;

このように、元の非テンプレート バージョンを使用していたFooクライアントは変更する必要がなく、デフォルトをオーバーライドする柔軟性が必要なクライアントNはジェネリック クラス テンプレートを使用できます。

FooN<128> obj;
于 2013-05-30T18:34:35.063 に答える
2

最初に質問に答えるには: いいえ、なしで使用する方法はありません<>。ただし、コードベースをそのまま維持するために他に何かできないというわけではありません。

最も簡単な解決策は、テンプレート化されたバリアントの名前を別の名前に変更し、その名前の Typedef を提供することですFoo

template <size_t N = 64>
struct GenericFoo
{
someArray[N];
//...other stuff
};
typedef GenericFoo<64> Foo;

このようFooにして、他のすべてのインスタンスで使用し続けることができ、GenericFoo<Whatever>きめ細かい制御が必要なときに使用するオプションがあります。

于 2013-05-30T18:34:57.413 に答える
0
namespace generic
{
  template <int N> class Foo {};
}

// user code

typedef generic::Foo<64> Foo; // common users

// OR

using generic::Foo; // rare users
于 2013-05-30T18:42:40.647 に答える