我在某处使用了一个结构,声明为:
struct Foo
{
someArray[64];
//...other stuff
};
它在很多地方被广泛使用,我想将其更改为:
template <size_t N = 64>
struct Foo
{
someArray[N];
//...other stuff
};
因为有一个地方(确切地说是四个),这个结构需要与128字节数组一起使用以确保正确性,但它为所有其他用途引入的惩罚是不值得的。在提供默认模板参数时,我希望它能透明地进行,除了那些需要更宽内部数组然后声明Foo<128>
的技术诀窍的人。不幸的是,它似乎强迫每次使用它来说Foo<>
。有办法解决这个问题吗?
答案 0 :(得分:4)
实例化类模板时,不能省略尖括号。
但是,您可以为Foo
类模板(例如FooN
)指定其他名称,然后提供类型别名,例如:
typedef FooN<> Foo;
这样,不必更改使用原始非模板版Foo
的客户端,而需要覆盖默认N
的灵活性的客户端可以使用通用课程模板:
FooN<128> obj;
答案 1 :(得分:2)
首先回答这个问题:没有<>
没有办法使用它。但是,这并不意味着您无法做其他事情来保持代码库的完整性。
最简单的解决方案是将模板化变体重命名为其他内容,并为名称Foo
提供Typedef:
template <size_t N = 64>
struct GenericFoo
{
someArray[N];
//...other stuff
};
typedef GenericFoo<64> Foo;
通过这种方式,您可以在所有其他实例中继续使用Foo
,并且在需要细粒度控制时可以选择使用GenericFoo<Whatever>
。
答案 2 :(得分:0)
namespace generic
{
template <int N> class Foo {};
}
// user code
typedef generic::Foo<64> Foo; // common users
// OR
using generic::Foo; // rare users