Tensorflow Несовместимые формы

Для тех из вас, кто хочет что-то действительно базовое и портативное, но не имеет доступа к функциям C ++ 11, я написал только что. Обычно используйте STATIC_ASSERT (вы можете записать его дважды в той же функции, если хотите) и использовать GLOBAL_STATIC_ASSERT вне функций с уникальной фразой в качестве первого параметра.

#if defined(static_assert)
#   define STATIC_ASSERT static_assert
#   define GLOBAL_STATIC_ASSERT(a, b, c) static_assert(b, c)
#else
#   define STATIC_ASSERT(pred, explanation); {char assert[1/(pred)];(void)assert;}
#   define GLOBAL_STATIC_ASSERT(unique, pred, explanation); namespace ASSERTATION {char unique[1/(pred)];}
#endif

GLOBAL_STATIC_ASSERT(first, 1, "Hi");
GLOBAL_STATIC_ASSERT(second, 1, "Hi");

int main(int c, char** v) {
    (void)c; (void)v;
    STATIC_ASSERT(1 > 0, "yo");
    STATIC_ASSERT(1 > 0, "yo");
//    STATIC_ASSERT(1 > 2, "yo"); //would compile until you uncomment this one
    return 0;
}

Объяснение : Сначала он проверяет, есть ли у вас реальное утверждение, которое вы, безусловно, захотите использовать, если оно доступно. Если вы этого не сделаете, вы получите свой pred текст и разделите его самостоятельно. Это делает две вещи. Если он равен нулю, id est, утверждение не сработало, это приведет к делению на нулевую ошибку (арифметика вынуждена, потому что она пытается объявить массив). Если он не равен нулю, он нормализует размер массива до 1. Поэтому, если это утверждение прошло, вы бы не захотели, чтобы он сбой в любом случае, потому что ваш предикат был оценен как -1 (недействителен) или был 232442 (массовая потеря пространства, IDK, если бы он был оптимизирован). Для STATIC_ASSERT он завернут в фигурные скобки, что делает его блоком, который использует переменную assert, что означает, что вы можете писать ее много раз. Он также переключает его на void, что является известным способом избавиться от предупреждений unused variable. Для GLOBAL_STATIC_ASSERT вместо того, чтобы быть в блоке кода, он генерирует пространство имен. Пространства имен разрешены вне функций. Идентификатор unique необходим, чтобы остановить любые конфликтующие определения, если вы используете этот один более одного раза.


Работал для меня на GCC и VS'12 C ++

0
задан Luno 19 March 2019 в 20:46
поделиться