Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 部分专门化问题_C++ - Fatal编程技术网

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_文档中描述的类型参数,如果我说的对吗?是的,没错。与这里的一样,条件必须是不相交的,这样您就不会产生歧义: