将模板类完全专门化为已定义的专门化的正确语法是什么?
例如,在下面的代码中,如何将A<2>
声明为A<0>
的别名?
template <int I>
struct A;
template <>
struct A<0> { int x; };
template <>
struct A<1> { int y; };
template <>
using A<2> = A<0>; // error: expected unqualified-id before 'using'
注意:对于上面的代码,专门化A<1>
并定义非专门化的A
(如A<0>
)就足够了:
template <int I>
struct A { int x; };
template <>
struct A<1> { int y; };
但是如果你遇到更复杂的情况,这就不起作用了,对于一组值你有一个专门化,对于另一组值你有另一个专门化,等等...
3条答案
按热度按时间ctrmrzij1#
我不确定我是否理解了你的问题,因为你通过尝试解决它来描述它。
下面是我实现类似结果的方法:
https://godbolt.org/z/fGxcoE5xd
使用类型特征的版本更短:
https://godbolt.org/z/vMqPahfEo
js81xvg62#
更复杂的情况,对于一组值有一个专门化,对于另一组值有另一个专门化,等等...
在这里,一定程度的间接性会有所帮助。
Foo<0>
和Foo<2>
是同一类型。您可以向Foo_impl
添加更多专门化,并且可以在模板参数I
和专门化J
的实际索引之间添加更多Map。e3bfsja23#
其他答案应该可以,我只是想提供一个基于SFINAE的解决方案:
注意:虽然这段代码允许
A<0>
和A<2>
共享一个实现,但是它们不会是相同的类型。std::is_same_v<A<0>, A<2>>
对于其他答案将返回true,但对于这个答案将返回false。