fork download
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <type_traits>
  4. using namespace std;
  5.  
  6. struct A{
  7. const int a;
  8. int b;
  9. };
  10.  
  11. template<typename T> struct tmpl;
  12.  
  13. template<typename Class, typename FT> struct tmpl<FT(Class::*)>{
  14. static void f(){
  15. if ( std::is_const< FT >::value ) {
  16. cout<<"const as non const"<<endl;
  17. } else {
  18. cout<<"non const"<<endl;
  19. }
  20. }
  21. };
  22.  
  23. //Try commenting this out, code compiles, both A::a and A::b instantiate the first template
  24. /*template<typename Class, typename FT> struct tmpl<const FT(Class::*)>{
  25.   static void f(){
  26.   cout<<"const"<<endl;
  27.   }
  28. };*/
  29.  
  30. int main(){
  31. cout<<typeid(&A::a).name()<<endl; //prints "M1AKi"
  32. tmpl<decltype(&A::a)>::f(); //prints "const"
  33. cout<<typeid(&A::b).name()<<endl; //prints "M1Ai"
  34. tmpl<decltype(&A::b)>::f(); //prints "non const"
  35. //Let's do what it seems that can be done implicitly (providing only one template specialization) in an explicit way
  36. int(A::*memb)= const_cast< int (A::*) >( &A::a );
  37. cout<<typeid(memb).name()<<endl; //prints "M1Ai"
  38. tmpl<decltype(memb)>::f(); //prints "non const"
  39. }
  40.  
Success #stdin #stdout 0s 2828KB
stdin
Standard input is empty
stdout
M1AKi
const as non const
M1Ai
non const
M1Ai
non const