C++ 部分专门化问题
我需要一双新眼睛 这显然是非法的,但它表明了我的意图:C++ 部分专门化问题,c++,C++,我需要一双新眼睛 这显然是非法的,但它表明了我的意图: template <typename T, T> struct Foo { }; template <typename T> struct Foo <T, 0> //Obviously I can't do this. { }; 有没有办法把T包起来,或者做一些棘手的事情,这样这类事情就可以工作了 谢谢 是的,您可以使用以下技巧: template <typename T, T, T=0>
template <typename T, T> struct Foo
{
};
template <typename T> struct Foo <T, 0> //Obviously I can't do this.
{
};
有没有办法把T包起来,或者做一些棘手的事情,这样这类事情就可以工作了
谢谢 是的,您可以使用以下技巧:
template <typename T, T, T=0> struct Foo {
};
template <typename T, T t> struct Foo <T, t, t> {
};
现在,即使您说Foo,我们的部分专门化也不会被选择,因为条件t==0不是真的,因此::type将不可用。SFINAE当时没有选择专业化。当然,有了这个enable_if解决方案,您不局限于t为零。任何条件都可以。以下是在不使用boost的情况下启用的代码,以供参考。然后删除上面的_c后缀,我们不需要在下面的版本中使用它:
template<bool C, typename T = void>
struct enable_if {
typedef T type;
};
template<typename T>
struct enable_if<false, T> { };
是的,您可以使用以下技巧:
template <typename T, T, T=0> struct Foo {
};
template <typename T, T t> struct Foo <T, t, t> {
};
现在,即使您说Foo,我们的部分专门化也不会被选择,因为条件t==0不是真的,因此::type将不可用。SFINAE当时没有选择专业化。当然,有了这个enable_if解决方案,您不局限于t为零。任何条件都可以。以下是在不使用boost的情况下启用的代码,以供参考。然后删除上面的_c后缀,我们不需要在下面的版本中使用它:
template<bool C, typename T = void>
struct enable_if {
typedef T type;
};
template<typename T>
struct enable_if<false, T> { };
第三个参数只是为了在其中获取类型为T的值0。如果您想专门化两个值,比如0和1,那么必须使用boost::enable_文档中描述的类型参数,如果我说的对吗?是的,没错。与这里的一样,条件必须是不相交的,这样就不会产生歧义:第三个参数只是为了在其中获得类型为t的值0。如果您想专门化两个值,比如0和1,那么必须使用boost::enable_文档中描述的类型参数,如果我说的对吗?是的,没错。与这里的一样,条件必须是不相交的,这样您就不会产生歧义: