Использование std::less
достаточно (но использование operator<
не достаточно). Специализации указателей из std::less
(как указывает принятый ответ на «Использование std :: less with nullptr» ) гарантируют полное упорядочение . Сравнение с nullptr
является неопределенным , что означает, что стандарт не налагает конкретное упорядочение, но std::less
должен все же произвести полное упорядочение (и для данный указатель p
, p < nullptr
обязательно выдает одно и то же значение каждый раз).
Так как полное упорядочение сильнее, чем слабое, в вашем случае достаточно использовать std::less
.
РЕДАКТИРОВАТЬ: Если нет, то как правильно (например, как объединить std :: less с std :: tie)?
blockquote>К сожалению, не существует изящного способа. Поскольку
std::tie
возвращаетstd::tuple
, и сравнение кортежей определяется в терминахoperator<
по их значениям (а неstd::less
), вы не можете использовать здесьstd::tie
. Чтобы использоватьstd::less
, вам нужно будет сделать это вручную:bool operator<(const Foo& rhs) const { if (std::less<>{}(x, rhs.x)) return true; if (std::less<>{}(rhs.x, x)) return false; return std::less<>{}(y, rhs.y); }
Кроме того, ваша текущая реализация (переосмысление указателей как целых чисел) также производит полное упорядочение (очевидно, поскольку вы сравниваете целые числа), но вместо неопределенного поведения у вас будет определяемое реализацией поведение (из
reinterpret_cast
).
Если я не неправильно понимаю ситуацию, точно что Вы говорите о работах вполне прилично. Я просто испытал его с этим Xaml:
<Window x:Class="ConditionalTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<SolidColorBrush x:Key="MyColor" Color="Aqua" />
<VisualBrush x:Key="MyBrush">
<VisualBrush.Visual>
<Ellipse Height="50" Width="100" Fill="{DynamicResource MyColor}" />
</VisualBrush.Visual>
</VisualBrush>
</Window.Resources>
<Grid Background="{DynamicResource MyBrush}">
<Button Height="30" Width="Auto" VerticalAlignment="Center" HorizontalAlignment="Center" Content="ChangeColor" Click="Button_Click" />
</Grid>
</Window>
И затем измененный цвет в обработчике щелчков для той кнопки:
private void Button_Click(object sender, RoutedEventArgs e)
{
((SolidColorBrush)Resources["MyColor"]).Color = Colors.Purple;
}
И это работало как чемпион.
Можно ли отправить пример того, как Вы пытаетесь изменить цвет в словаре ресурса?
Когда я делаю демонстрационное приложение и попытку изменить значение ресурса, кажется, что SolidColorBrush в словаре ресурса был заморожен так, это не может быть изменено. Для обхождения этого, я просто установил новое значение к новому SolidColorBrush.