有没有办法使用默认模板参数而不必使用<>在C ++中?

时间:2013-05-30 18:30:55

标签: c++ templates

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

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

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

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

因为有一个地方(确切地说是四个),这个结构需要与128字节数组一起使用以确保正确性,但它为所有其他用途引入的惩罚是不值得的。在提供默认模板参数时,我希望它能透明地进行,除了那些需要更宽内部数组然后声明Foo<128>的技术诀窍的人。不幸的是,它似乎强迫每次使用它来说Foo<>。有办法解决这个问题吗?

3 个答案:

答案 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