提问人:Kevlar 提问时间:4/4/2023 最后编辑:Kevlar 更新时间:4/4/2023 访问量:58
使用别名模板进行模板参数推导,部分专用于类模板
Template argument deduction with alias template partially specializing a class template
问:
使用 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_int
foo_int(1.0)
foo_int<double>(1.0)
答:
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 进程)。
评论