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

Is there a way to use a default template argument without having to use <> in C++?

本文关键字:C++ lt gt 默认 有没有 参数 不必      更新时间:2023-10-16

我有一个正在某处使用的结构体,声明为:

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

它在许多地方被广泛使用,我想把它改成:

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

,因为在一个地方(确切地说是四个地方),这个结构体需要与一个128字节的数组一起使用以确保正确性,但它为所有其他用途带来的损失是不值得付出的。在提供默认模板参数时,我希望它能透明地通过,除了那些需要更广泛的内部数组的人,然后声明Foo<128>。不幸的是,它似乎迫使它的每次使用都说Foo<>。有办法解决这个问题吗?

在实例化类模板时不能省略尖括号。

然而,你可以给你的Foo类模板一个不同的名字(比如FooN),然后提供一个类型别名,如:
typedef FooN<> Foo;

这样,使用Foo的原始非模板版本的客户端将不必更改,并且需要覆盖默认N的灵活性的客户端可以使用泛型类模板:

FooN<128> obj;

首先回答这个问题:没有<>就没有办法使用它。但是,这并不意味着你不能做其他事情来保持你的代码库完整。

最简单的解决方案是将模板化的变体重命名为其他东西,并为名称Foo提供Typedef:

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

这样,您可以在所有其他实例中继续使用Foo,并且在需要细粒度控制时可以选择使用GenericFoo<Whatever>

namespace generic
{
  template <int N> class Foo {};
}
// user code
typedef generic::Foo<64> Foo; // common users
// OR
using generic::Foo; // rare users