【问题标题】:Alias to variadic template with no arguments不带参数的可变参数模板的别名
【发布时间】:2021-08-05 11:47:48
【问题描述】:

我发现了一些类似的主题,但似乎没有一个可以直接回答我的特定问题。

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

所以我将其转换为存储在一个 *.h 文件中的可变参数模板,但现在无论我们已经使用这个类,我都需要将每次出现的 Foo() 更改为 Foo<>(),以便现有代码能够作为它做了。 现在,我不确定是否有一些我什至不知道的模块会使用这个库,所以我想到了一个灵活的解决方案,比如 Foo 的别名,在此之后不需要更新其他模块图书馆的变化。

在这个特定的示例中是否可以使用类似using Foo = Foo<> 的内容,这样代码中已经存在的所有Foo 将自动被视为Foo<>,而无需对源代码进行任何更改?

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

【问题讨论】:

  • 在 C++17 中(带类模板参数推导)大多数情况下可以使用Foo 代替Foo<>。否则不行,不可能。
  • @HolyBlackCat:“大多数情况”。我不会这么说,不适用于成员、函数参数、类型(在模板中)... CTAD 仅用于实例化。

标签: c++ templates alias using variadic


【解决方案1】:

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

//old
class Foo;

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

using Foo = FooExtended<>;

【讨论】:

  • 这听起来既简单又很有希望......我会试试看
猜你喜欢
  • 2012-05-03
  • 2014-09-08
  • 2016-11-18
  • 1970-01-01
  • 2020-05-14
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多