template-class member function as a array.

#include <iostream>
#include <type_traits>
template<typename T=int, typename U=std::string>
class MemberFunction{
 private:
  T numberData;
  U strData;
  
  void getStr();
  void getNumber();
  
     template<typename Ty, typename Type>
  using Action=void (MemberFunction<Ty, Type>::*)();
   
  const Action<T, U> menu[2]={ &MemberFunction<T, U>::getNumber, &MemberFunction<T, U>::getStr };
  //如果这里不指出[2]在下面的初始化中会报错。 
  
  public:
   template<typename X, typename Y, class=typename std::enable_if< (std::is_same<T, X>::value && std::is_same<U, Y>::value), void>::type>
   MemberFunction(const X& number, const Y& str);
   
   ~MemberFunction();
   /*void getNumber()const;
   void getStr()const;*/
   
   enum Func:int{ NUMBER=0, STR=1 };
   
   /*template<typename Ty, typename Type>
   using Action=void (MemberFunction<Ty, Type>::*)();
   
      Action<T, U> menu[]={ &MemberFunction<T, U>::getNumber, &MemberFunction<T, U>::getStr };*/
      
      void choseFunction(const MemberFunction<T, U>::Func& temp);
};
template<typename T, typename U>
template<typename X, typename Y, class>
MemberFunction<T, U>::MemberFunction(const X& number, const Y& str)
                     :numberData(number),
                      strData(str)
{
 std::cout<<"success"<<std::endl;
}
template<typename T, typename U>
MemberFunction<T, U>::~MemberFunction()
{
 std::cout<<"clear data"<<std::endl;
}
template<typename T, typename U>
void MemberFunction<T, U>::getNumber()
{
 std::cout<<this->numberData<<std::endl;
}
template<typename T, typename U>
void MemberFunction<T, U>::getStr()
{
 std::cout<<this->strData<<std::endl;
}
template<typename T, typename U>
void MemberFunction<T, U>::choseFunction(const MemberFunction<T, U>::Func& temp)
{
 (this->*menu[temp])();
}
int main()
{
 /*template<typename Ty, typename Type>
 using Action= void (MemberFunction<Ty, Type>::*)();//这里使Action作为指向class内成员函数的指针.
 //这些必须写到class的内部. 
 template<typename V, typename W>
 Action<V, W> list[]={ &typename MemberFunction<V, W>::getNumber, & typename MemberFunction<V, W>::getStr };
 */
 
 MemberFunction<> myFunctionArray(int(10), std::string("shihuawoaini"));//class内的menu[2]必须指出来. 
 myFunctionArray.choseFunction( MemberFunction<int, std::string>::STR );
 
 
 return 0; 
}

你可能感兴趣的:(template-class member function as a array.)