Is it possible to specialize a template using a member enum?

前端 未结 2 1511
隐瞒了意图╮
隐瞒了意图╮ 2020-12-29 05:44
struct Bar {
  enum { Special = 4 };
};

template struct Foo {};
template struct Foo {};

U

相关标签:
2条回答
  • 2020-12-29 06:25

    Since that is not allowed by C++ as explained by Prasoon, so an alternative solution would be to use EnumToType class template,

    struct Bar {
      enum { Special = 4 };
    };
    
    template<int e>
    struct EnumToType
    {
      static const int value = e;
    };
    
    template<class T, class K> //note I changed from "int K" to "class K"
    struct Foo
    {};
    
    template<class T> 
    struct Foo<T, EnumToType<(int)T::Special> > 
    {
       static const int enumValue = T::Special;
    };
    

    Sample code at ideone : http://www.ideone.com/JPvZy


    Or, you can simply specialize like this (if it solves your problem),

    template<class T> struct Foo<T,Bar::Special> {};
    
    //usage
    Foo<Bar, Bar::Special> f;
    
    0 讨论(0)
  • 2020-12-29 06:27

    The type of a non-type template argument cannot depend on a template parameter of a partial specialization.

    ISO C++03 14.5.4/9 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.

    template <int I, int J> struct A {};
    template <int I> struct A<I+5, I*2> {}; //error
    template <int I, int J> struct B {};
    template <int I> struct B<I, I> {};     //OK
    

    So something like this is illegal template<class T> struct Foo<T,T::Special> {}; because T::Special depends on T

    The usage is also illegal. You have provided one template argument but you need to provide two.

    0 讨论(0)
提交回复
热议问题