通过实现两个不同于const的函数来避免代码重复

时间:2016-10-03 12:52:00

标签: c++

我有一个通用的Matrix类,我有两个版本的operator(), 一个const方法,它返回一个对索引的const引用, 和一个非const方法,返回索引的非const引用(允许我更改它。

我试图通过使用const_cast并调用const版本来使用非const版本,但由于某种原因它不起作用:

template<typename T>
class Matrix
{

    std::vector<T> _matrix;
    unsigned int _rows;
    unsigned int _cols;
 public:
    const T& operator()(unsigned int row, unsigned int col) const
    {
        return _matrix[col + (_cols * row)];
    }

    T& operator()(unsigned int row, unsigned int col)
    {
    return const_cast<T&>(static_cast<const Matrix*> (*this).operator(row, col));
    }
};

它不允许我在最后一行向操作符添加(row,col)。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

在这里,代码重复是两个邪恶中较小的一个。只需在非<Page x:Class="UWPTest.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UWPTest" xmlns:common="using:UWPTest.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <common:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> </Page.Resources> <Grid Background="Transparent"> <ToggleButton x:Name="TogglePaneButton" Visibility="{x:Bind ViewModel.IsInDetailsMode, Mode=OneWay, ConverterParameter=Reverse, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0" TabIndex="1" Checked="{x:Bind CheckTogglePaneButtonSizeChanged}" Unchecked="{x:Bind CheckTogglePaneButtonSizeChanged}" IsChecked="{Binding IsPaneOpen, ElementName=RootSplitView, Mode=TwoWay}" AutomationProperties.Name="Menu" ToolTipService.ToolTip="Menu" Style="{StaticResource SplitViewTogglePaneButtonStyle}"/> </Grid> </Page> 版本中重复使用_matrix[col + (_cols * row)]表达式。不要与这种语言作斗争。

要调用const版本,您需要const const_cast指针。你所追求的表达是this,它更难以阅读并且包含令人不安的const_cast<T&>(const_cast<const Matrix*>(this)->operator()(row, col));;两次。

答案 1 :(得分:4)

在我看来,这不是你想要避免代码重复的情况。所以我建议如下:

const T& operator()(unsigned int row, unsigned int col) const {
  return _matrix[col + (_cols * row)];
}

T& operator()(unsigned int row, unsigned int col) {
  return _matrix[col + (_cols * row)];
}

它比具有const_cast的版本更具可读性,并且可能更快,因为您避免了不必要的堆栈帧。

答案 2 :(得分:1)

你快到了:

return const_cast<T&>(const_cast<const Matrix*>(this)->operator()(row, col));