没有参数的可变参数模板的别名

3

我发现有一些类似的话题,但没有一个能够直接回答我的问题。

我们使用了一个库中的类(我们称之为Foo),跨越多个模块。现在我需要将这个类转换为可变参数模板(因此现在我有:template<class... T> Foo() {}),因为一些新的用法需要完全相同的通用机制,但需要接受额外的参数。已经在使用中的旧实现不需要这些参数。

所以我把它转成了存储在一个*.h文件中的可变参数模板,但现在无论我们在哪里使用这个类,我都需要将每一个出现的Foo()改为Foo<>(),以使现有代码像以前一样工作。 现在,我不确定是否有一些模块我甚至不知道会使用这个库,因此我考虑了一种灵活的解决方案,例如引入一个别名到Foo<>,这样在更改库后就不需要更新其他模块。

在这个特定的示例中,是否可能使用类似于using Foo = Foo<>的方式,以便所有已经存在于代码中的Foo实例都自动被视为Foo<>,而不需要对源代码进行任何更改?

即使它将具有与类本身完全相同的名称,是否可能在模板定义/声明的同一文件中定义这样的别名?


在C++17中(使用类模板参数推导),在大多数情况下可以使用Foo代替Foo<>。否则不行。 - HolyBlackCat
2
@HolyBlackCat: “大多数情况下”。我不会这么说,对于成员、函数参数、类型(在模板中)等情况并非如此... CTAD 仅用于实例化。 - Jarod42
1个回答

3

如果你将Foo的模板化定义重命名为其他名称FooExtended,那么你可以将空模板typedefFoo

//old
class Foo;

//new
template<class... Args>
class FooExtended;

using Foo = FooExtended<>;

这听起来既非常简单又很有前途...我会试一下。 - Frosty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接