15

bool我尝试使用(不像流行的void_ 技巧)来实现 SFINAE :

  template<typename T, bool = true>
  struct Resolve
  {
    static const bool value = false;
  };

  template<typename T>
  struct Resolve<T, T::my_value>
  {
    static const bool value = true;
  };

目标是专门化其中static const bool my_value = true;定义的类。如果它们已定义false或未定义,则不要专门化它。IE

struct B1 {  // specialize Resolve for this case
  static const bool my_value = true;
};
struct B2 {  // don't specialize
  static const bool my_value = false;
};
struct B3 {};  // don't specialize

应用上述技巧时B1会出现编译错误:

Resolve<B1>::value;

错误:模板参数“T::my_value”涉及模板参数

我知道这可以通过其他方式来实现。但是,我有兴趣知道,为什么它会在这里给出编译器错误,并且可以在这段代码本身中解决它吗?

4

1 回答 1

32

实际上,第 14.5.4/9 节禁止您所做的事情,该节说,

部分特化的非类型实参表达式不应涉及部分特化的模板形参,除非实参表达式是简单标识符。

诀窍也可以是使用第二个模板参数的类型,封装非类型值,如下所述:

template<bool b> struct booltype {};

template<typename T, typename B = booltype<true> >
struct Resolve
{
  static const bool value = false;
};

template<typename T>
struct Resolve<T, booltype<T::my_value> >
{
  static const bool value = true;
};

现在它编译罚款

于 2011-10-15T07:34:21.333 回答