当前位置 : 首页 » 互动问答 » 正文

如何正确地创建T类型的模板对象,即T result = T();

分类 : 互动问答 | 发布时间 : 2017-09-30 11:05:37 | 评论 : 1 | 浏览 : 34 | 喜欢 : 0

嗨,我想创建一个T类型的对象,其中T是通过使用T result = T()的指针。但不是调用构造函数,而是简单地返回一个空指针。

以下是一些受影响代码的示例:

 template <class T>
    T readBlockchain(std :: ifstream * stream){
        T result = T(); //此后结果为空
        decltype(result-> getLastBlock())blkPtr = result-> getLastBlock();
        auto blk = * blkPtr;
        decltype(result-> getLastBlock())lastBlock =&readBlock <decltype(blk)>(stream);
        如果(!lastBlock->验证())
            返回nullptr;
        unsigned long count = * readUnsignedLong(stream);
        unsigned long orphanCount = * readUnsignedLong(stream);
        std :: map <std :: string,decltype(blk)> blocks = std :: map <std :: string,decltype(blk)>();
        for(int i = 0; i <count  -  1; i ++){
            decltype(blk)block = readBlock <decltype(blk)>(stream);
            如果(!block.verify())
                返回nullptr;
            blocks.insert(std :: make_pair(block.getHash(),block));
        }
        std :: vector <blockchain <decltype(blk)> *> orphanedChains = std :: vector <Blockchain <decltype(blk)> *>();
        for(int i = 0; i <orphanCount  -  1; i ++){
            Blockchain <decltype(blk)> * orphan =&readOrphanedChain <Blockchain <decltype(blk)>>(stream);
            orphanedChains.push_back(孤儿);
        }
        result-> setLastBlock(lastBlock);
        result-> setCount(计数);
        result-> setOrphanCount(orphanCount);
        result-> setBlocks(块);
        result-> setOrphanedChains(orphanedChains);
        返回结果;
    }

回答(1)

  • 1楼
  • 如果我的理解是正确的。为了正确地概括你的 readBlockchain ,当T是一个指针在堆中创建T的新对象时,以及T是一个具体类型来创建一个常规T对象调用T的构造函数。一种解决方案是使用以下专业化构造:

     template <typename T>
    struct CreateNew {
      模板<typename ... Args>
      static T apply(Args && ... args){return T(std :: forward <Args>(args)...); }
    };
    
    模板<typename T>
    struct CreateNew <T *> {
      模板<typename ... Args>
      静态decltype(auto)apply(Args && ... args){return std :: make_unique <T>(std :: forward <Args>(args)...); }
    };
    

    也就是说,您可以创建一个模板类,该模板类需要一个模板参数T以及该模板类专用于T*类型的指针。在主模板(例如静态成员函数apply)中,您将通过调用类T的构造函数创建类型为T的对象,并在专业化内部创建T*堆对象(请注意,为了方便起见,我返回一个 std :: unique_ptr <T *> )。

    Thus, your readBlockChain 模板函数将变为:

     template <class T>
    decltype(auto)readBlockchain(std :: ifstream * stream){
      auto result = CreateNew <T> :: apply(/ * T构造函数参数* /);
      ...
      返回结果;
    }

    Live Demo

相关阅读: