станд :: is_enum & л; Т & GT; эквивалент для идентификации классов перечисления [duplicate]

Короткие ответы

Если вы хотите получить более подробные объяснения следующих команд, см. длинные ответы в следующем разделе.

Удаление удаленной ветви:

git push origin --delete   # Git version 1.7.0 or newer
git push origin :          # Git versions older than 1.7.0

Удаление локальной ветви:

git branch --delete 
git branch -d  # Shorter version
git branch -D  # Force delete un-merged branches

Удаление локальной ветви удаленного слежения:

git branch --delete --remotes /
git branch -dr / # Shorter

git fetch  --prune # Delete multiple obsolete tracking branches
git fetch  -p      # Shorter

Длинный ответ: есть три разных ветви для удаления !

Когда вы имеете дело с удалением ветвей как локально, так и удаленно, имейте в виду, что задействованы 3 разных ветви:

  1. Локальная ветвь X.
  2. Фиксация удаленного источника X.
  3. Локальная ветвь удаленного отслеживания origin/X, которая отслеживает удаленное отделение X.

Visualization of 3 branches [/g12]

Исходный плакат использовал

git branch -rd origin/bugfix

, который удалил только локальную ветвь удаленного отслеживания origin/bugfix, а не фактическую удаленную ветвь bugfix на origin.

Diagram 2 [/g13]

Чтобы удалить эту реальную удаленную ветвь, вам необходимо

git push origin --delete bugfix

Diagram 3 [/g14]

Дополнительная информация

В следующих разделах описаны дополнительные сведения, которые следует учитывать при удалении ветвей удаленного и удаленного отслеживания.

Нажатие для удаления удаленных филиалов также удаляет ветви удаленного отслеживания

Обратите внимание, что удаление удаленной ветви X из командной строки с помощью git push также удалит локальную ветвь удаленного отслеживания origin/X, поэтому нет необходимости обрезать устаревшую ветвь удаленного отслеживания с помощью git fetch --prune или git fetch -p, хотя она не будет "

Вы можете проверить, что ветвь удаленного отслеживания origin/X также была удалена, выполнив следующее:

# View just remote-tracking branches
git branch --remotes
git branch -r

# View both strictly local as well as remote-tracking branches
git branch --all
git branch -a

Обрезка устаревшего локального пульта дистанционного управления -tracking origin origin / X

Если вы не удалили удаленную ветвь X из командной строки (например, выше), то ваше местное репо все равно будет содержать (теперь устаревшую) ветвь удаленного отслеживания origin/X. Это может произойти, если вы удалили удаленную ветку непосредственно через веб-интерфейс GitHub, например.

Типичный способ удаления этих устаревших ветвей удаленного отслеживания (с версии Git 1.6.6) - просто запустить git fetch с --prune или короче -p. Обратите внимание, что это удаляет все устаревшие локальные ветви удаленного отслеживания для любых удаленных филиалов, которые больше не существуют на удаленном компьютере:

git fetch origin --prune
git fetch origin -p # Shorter

Вот соответствующая цитата из примечаний к выпуску 1.6.6 (выделено мной):

«git fetch» ​​learn --all и --multiple опции, чтобы запустить выборку из многих репозиториев и --prune для удаления удаленных ветвей отслеживания, которые пошли несвежий. Они делают «git remote update» и «git remote prune» менее необходимым (нет плана удаления «удаленного обновления» или «удаленной обрезки», хотя).

blockquote>

Альтернатива вышеописанному автоматическому обрезка для устаревших ветвей удаленного отслеживания

В качестве альтернативы вместо обрезания устаревших локальных ветвей удаленного отслеживания через git fetch -p, вы можете избежать дополнительной работы в сети , просто удалив вручную ветвь (ы) с флагами --remote или -r:

git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter

См. также

13
задан Andy Prowl 23 March 2013 в 13:40
поделиться

1 ответ

Вот возможное решение:

#include <type_traits>

template<typename E>
using is_scoped_enum = std::integral_constant<
    bool,
    std::is_enum<E>::value && !std::is_convertible<E, int>::value>;

В решении используется различие в поведении между областью видимости и неперечисленными перечислениями, указанными в параграфе 7.2 / 9 стандарта C ++ 11:

< blockquote>

Значение перечислителя или объекта неперечисленного типа перечисления преобразуется в целое число путем цельной рассылки (4.5). [...] Обратите внимание, что это неявное преобразование enum to int не предоставляется для перечисления с областью. [...]

Вот демонстрация того, как вы его используете:

enum class E1 { };
enum E2 { };
struct X { };

int main()
{
    // Will not fire
    static_assert(is_scoped_enum<E1>::value, "Ouch!");

    // Will fire
    static_assert(is_scoped_enum<E2>::value, "Ouch!");

    // Will fire
    static_assert(is_scoped_enum<X>::value, "Ouch!");
}

И вот живой пример .

Благодарности:

Благодаря Даниэлю Фрей за то, что мой предыдущий подход будет работать только до тех пор, пока не будет определена пользовательская перегрузка operator +.

21
ответ дан Community 26 August 2018 в 02:51
поделиться
Другие вопросы по тегам:

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