加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何重构具有相同行的函数,只有一个函数调用不同?

发布时间:2020-12-16 06:52:30 所属栏目:百科 来源:网络整理
导读:请考虑以下代码段 template typename Tvoid MyDynamicArrayT::resize(size_t count){ size_t prev_count = Count(); if(count prev_count) { DestroyMemory(prev_count,count); } else if(count prev_count) { Reserve(count); for(size_t i=prev_count; ico
请考虑以下代码段

template <typename T>
void MyDynamicArray<T>::resize(size_t count)
{
    size_t prev_count = Count();
    if(count < prev_count)
    {
       DestroyMemory(prev_count,count);
    }
    else if(count > prev_count)
    {
      Reserve(count);

      for(size_t i=prev_count; i<count; i++)
      {
         // change in function call
         m_block.DefaultConstruct();
      }
    }
  }

这是同一功能的重载

template<typename T>
  void MyDynamicArray<T>::resize(const T &object,size_t count)
  {
     size_t prev_count = Count();
    if(count < prev_count)
    {
       DestroyMemory(prev_count,count);
    }
    else if(count > prev_count)
    {
      Reserve(count);

      for(size_t i=prev_count; i<count; i++)
      {
         // change in function call
         m_block.CopyConstruct(object);
      }
    }
  }

一种方法,我认为重构resize函数是提供const T * pObject作为默认参数.并检查是否提供,然后,调用CopyConstruct.

另一种方法是提供一个调整大小调整另一个调整大小的包装器.

什么是最好的方法?

解决方法

一种解决方案是创建一个虚拟对象,您可以将其传递给新函数m_block.Construct()以指示它是默认构造:

struct default_construct_t { };

我们在最后使用的是:

template <typename T>
void MyDynamicArray<T>::resize(size_t count) {
    resize(count,default_construct_t());
}

template <typename T,typename Obj>
void MyDynamicArray<T>::resize(size_t count,Obj const& obj)
{
    size_t prev_count = Count();
    if(count < prev_count)
    {
       DestroyMemory(prev_count,count);
    }
    else if(count > prev_count)
    {
      Reserve(count);

      for(size_t i=prev_count; i<count; i++)
      {
         // change in function call
         m_block.Construct(obj);
      }
    }
  }

现在你只需要为Construct(default_construct_t)和Construct(T const&)提供重载.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读