gpt4 book ai didi

c++ - 如何重构具有相同行的函数,唯一不同的是一个函数调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:42 25 4
gpt4 key购买 nike

考虑以下代码片段

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);
}
}
}

一种方法,我认为重构调整大小函数是提供 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& ) 提供重载。

关于c++ - 如何重构具有相同行的函数,唯一不同的是一个函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39442639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com