使用别名模板进行模板参数推导,部分专用于类模板

Template argument deduction with alias template partially specializing a class template

提问人:Kevlar 提问时间:4/4/2023 最后编辑:Kevlar 更新时间:4/4/2023 访问量:58

问:

使用 C++20,有没有办法将类模板参数推导与部分专用于模板类的别名模板?

以下代码显示了我想要实现但无法使用 g++12 编译的内容:

template <typename T, typename U> struct foo;

template <typename T> struct foo<T, int> {
  const T t;

  foo(T t) : t(t) {}
};

template <typename T> using foo_int = foo<T, int>;

int main() {
  auto bar = foo_int(1.0); // FAILS
}

在此示例中,在尝试实例化 时不考虑定义的构造函数 。foo<T, int>bar

如果我使用派生类而不是类型别名,则相同的示例有效,但这并不是我真正要实现的。同样,我可以通过替换为 来使其工作,但我想避免这种情况。foo_intfoo_int(1.0)foo_int<double>(1.0)

G++ C++20 类型别名部分 专用化 CTAD

评论


答:

0赞 StoryTeller - Unslander Monica 4/4/2023 #1

在进行类模板参数推导时,不会考虑来自(部分)专用化的构造函数(即使它是通过 C++20 中对别名模板的新支持,这并非没有其自身的局限性)。

由于您的主模板不完整,您可以添加一个明确的推导指南来使其正常工作。例如

template <typename T>
using foo_int = foo<T, int>;

template <typename T>
foo(T) -> foo<T, int>;

但是,如果您有多个别名,则这是一个不完美的解决方案。因为一个演绎指南只能指定第二个参数一次。在这种情况下,我建议您重新使用继承而不是别名(因为它们可以具有独立的 CTAD 进程)。