开发者

SFINAE tried with bool gives compiler error: "template argument ‘T::value’ involves template parameter" [duplicate]

开发者 https://www.devze.com 2023-04-13 09:27 出处:网络
This question already has answers here: Why is it disallowed for partial specialization in a non-type argument to use nested template parameters
This question already has answers here: Why is it disallowed for partial specialization in a non-type argument to use nested template parameters (2 answers) Closed 7 years ago.

I tried to implement an SFINAE using bool (unlike popular void_ trick):

  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;
  };

The goal is to specialize, the classes which have static const bool my_value = true; defined inside it. If they are defined false or not defined then don't specialize it. i.e.

struct B1 {  // specialize Resolv开发者_如何学Pythone 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

When applying the above trick on B1 it gives the compilation error:

Resolve<B1>::value;

error: template argument ‘T::my_value’ involves template parameter(s)

I am aware that this can be achieved with alternate ways. However, I am interested in knowing, why it gives compiler error here and can it be solved in this code itself ?


Actually what you're doing is forbidden by section §14.5.4/9 which says,

A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.

The trick could be using a type for second template parameter as well, encapsulating the non-type value, as described below:

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;
};

Now it compile fines.

0

精彩评论

暂无评论...
验证码 换一张
取 消