범형vector.
 #include <iostream>
#include <type_traits>
#include <vector>
#include <functional>
#include <typeinfo>class Any{
 public:
  template<typename U>
  using StorageType = typename std::decay<U>::value;
  
  //   std::endabled_if< !std::is_same<StrageType<Z>, Any<Z>>::value, void>::type >     ,      Z      . 
  
  template<typename Z, class = typename std::enable_if<!std::is_same<StorageType<Z>, Any>::value, void>::type>
  Any(Z&& m_value):ptr(new Container<StorageType<Z>>(std::forward<Z>(m_value)))
  {
   std::cout<<"constructor"<<std::endl;
  }
  
  Any():ptr(nullptr){}//      . 
  
  
  ~Any()//     
  {
   if(ptr != nullptr){
    delete ptr;
   }
  }
  
  Any(const Any& copy):ptr(copy.ptr)//       
  {
   std::cout<<"copy for constructor"<<std::endl;
  }
  
  Any(Any&& m):ptr(m.ptr)//      . 
  {
   if(m.ptr != nullptr){
    m.ptr=nullptr;
   }
  }
  
  template<typename L>
  inline operator L()const
  {
   return this->as<StorageType<L>>();
  }
  
  template<typename tt>
  inline StorageType<tt> as()
  {
   typedef StorageType<tt> tempType;
   
   if(ptr == nullptr){
    std::cout<<"there is nothing!"<<std::endl;
    throw std::bad_cast();
    
   }else{
    auto tempPtr=dynamic_cast<Container<tempType>*>(ptr);
    
    if(tempPtr == nullptr){
     throw std::bad_cast();
    }
    
    return tempPtr->value;
   }
  }
  
  template<typename TT>
  inline StorageType<TT> valueFunc() //        inline           class            inline . 
  {
   return this->as<StorageType<TT>>();
  }
  
  
  private:
   
   //         pure-virtual-class  Any      . 
   class ContainerBase{
    public:
    virtual ~ContainerBase(){}
    
    virtual ContainerBase* clone()const=0;
   };
   
   
   template<typename X>
   class Container:public ContainerBase{
    public:
     
     template<typename Y>
     Container(Y&& _value):value(std::forward<Y>(_value)){}
     
     ~Container(){}
     
     virtual Container* clone()const override
     {
      return new Container<X>(this->value);
     }
     
     X value;
   };
   
   ContainerBase* ptr;
};Any::ContainerBase*  Any::ContainerBase::clone()const
{
 return nullptr;
}struct PollyTypePush{
 
 template<typename Ty>
 void operator()(std::vector<Any>& container, Ty&& value)
 {
  container.emplace_back(std::forward<Ty>(value));
 }
 
};int main()
{
 short int i=5;
 std::string sTr("shihuawoaini");
 
 std::vector<Any> myContainer;
 auto PollyTypePushFunc=bind(PollyTypePush(), std::ref(myContainer), std::placeholders::_1);
 
 PollyTypePushFunc(1);
 
 std::cout<< myContainer[0].valueFunc<int>() <<std::endl;
 return 0;
}이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.