在C++中void func() const 和void func()可以形成重载函数,如果void func() const和void func()写同样的代码实现func功能,这样就造成了代码浪费(重复写代码)。这种问题的解决方式就是利用static_cast达到代码复用的目的(重复利用代码)。
下面给出一个转换过程:
// 实例只是为了讲述转换过程
class TestBlock
{
public:
bool checkIndex(const size_t index) noexcept
{
return index>=0 && index<this->m_text.size();
}
bool isValid() const noexcept
{
return this->m_text.empty();
}
const char& operator[](const size_t index) const noexcept
{
if (!isValid() || !checkIndex()) // 代码重复
return char('\0');
return this->m_text[index];
}
const char& operator[](const size_t index) noexcept
{
if (!isValid() || !checkIndex()) // 代码重复
return char('\0');
return this->m_text[index];
}
private:
string m_text;
};
转换之后:( 注意static_cast<const T&>(*this) )
// 实例只是为了讲述转换过程
class TestBlock
{
public:
bool checkIndex(const size_t index) noexcept
{
return index>=0 && index<this->m_text.size();
}
bool isValid() const noexcept
{
return this->m_text.empty();
}
const char& operator[](const size_t index) const noexcept
{
if (!isValid() || !checkIndex()) // 代码重复
return char('\0');
return this->m_text[index];
}
const char& operator[](const size_t index) noexcept
{
return static_cast<const TextBlock&>(*this)[index]; // 给this指针加上const属性,然后调用const版本的operator[]
}
private:
string m_text;
};