3

我在某处使用了一个结构,该结构声明为:

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

它在许多地方被广泛使用,我想将其更改为:

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

因为有一个地方(确切地说是四个)需要将此结构与 128 字节数组一起使用以确保正确性,但它为所有其他用途引入的惩罚不值得付出。在提供默认模板参数时,我希望它能够透明地通过,除了那些需要更广泛的内部数组的技术人员,然后声明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 回答