C++ Получает название типа в шаблоне

Вы можете думать об этом, как, else как в остальной части материала, или другой материал, который не был сделан в цикле.

69
задан Fire Lancer 17 July 2009 в 12:17
поделиться

2 ответа

Решение Джесси Бедера, вероятно, лучшее, но если вам не нравятся имена, которые вам дает typeid (я думаю, что gcc дает вам искаженные имена, например), вы можете сделать что-то вроде:

template<typename T>
struct TypeParseTraits;

#define REGISTER_PARSE_TYPE(X) template <> struct TypeParseTraits<X> \
    { static const char* name; } ; const char* TypeParseTraits<X>::name = #X


REGISTER_PARSE_TYPE(int);
REGISTER_PARSE_TYPE(double);
REGISTER_PARSE_TYPE(FooClass);
// etc...

А затем используйте его как

throw ParseError(TypeParseTraits<T>::name);

EDIT:

Вы также можете объединить два, изменив name на функцию, которая по умолчанию вызывает typeid (T) .name () , а затем специализироваться только на тех случаях, когда это неприемлемо.

35
ответ дан 24 November 2019 в 13:40
поделиться

Комментарий Мартина Коничека, чтобы полностью отключить выбор элементов самым простым способом:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

Однако, если вам все еще требуется функциональные возможности ListView, такие как возможность выбора элемента, затем вы можете визуально отключить стилизацию выбранного элемента следующим образом:

Вы можете сделать это несколькими способами, изменив ListViewItem's ControlTemplate просто установить стиль (намного проще). Вы можете создать стиль для ListViewItems с помощью ItemContainerStyle и «выключить» фон и кисть границы, когда они выбраны.

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="Background"
                            Value="{x:Null}" />
                    <Setter Property="BorderBrush"
                            Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

Кроме того,

64
ответ дан 24 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: