我有一个通用的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)。有什么想法吗?
答案 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));