python: spyder: не может редактировать предыдущую команду в консоли при запуске ipdb

Поскольку совместная работа ухаживает, и я провел несколько часов, играя с базовым примером , это сторона, я также опубликую свое решение.

Связанная версия в статье есть два основных недостатка. Максимальное количество, которое он может подсчитать, очень низкое, из-за малой глубины рекурсии (обычно около 256). И время, затрачиваемое на компиляцию, как только подсчет более нескольких сотен был достигнут, огромен.

Реализовав двоичный поиск, чтобы определить, установлен ли флаг для счетчика или нет, можно увеличить максимальное количество (контролируемое через MAX_DEPTH), а также улучшить время компиляции одновременно. =)

Пример использования:

static constexpr int a = counter_id();
static constexpr int b = counter_id();
static constexpr int c = counter_id();

#include 

int main () {
    std::cout << "Value a: " << a << std::endl;
    std::cout << "Value b: " << b << std::endl;
    std::cout << "Value c: " << c << std::endl;
}

Полностью рабочий код с примером в конце: (За исключением clang. См. комментарии.)

// Number of Bits our counter is using. Lower number faster compile time,
// but less distinct values. With 16 we have 2^16 distinct values.
#define MAX_DEPTH 16

// Used for counting.
template
struct flag {
    friend constexpr int adl_flag(flag);
};

// Used for noting how far down in the binary tree we are.
// depth<0> equales leaf nodes. depth equals root node.
template struct depth {};

// Creating an instance of this struct marks the flag as used.
template
struct mark {
    friend constexpr int adl_flag (flag) {
        return N;
    }

    static constexpr int value = N;
};

// Heart of the expression. The first two functions are for inner nodes and
// the next two for termination at leaf nodes.

// char[noexcept( adl_flag(flag()) ) ? +1 : -1] is valid if flag exists.
template ()) ) ? +1 : -1]>
int constexpr binary_search_flag(int,  depth, flag,
        int next_flag = binary_search_flag(0, depth(), flag())) {
    return next_flag;
}

template 
int constexpr binary_search_flag(float, depth, flag,
        int next_flag = binary_search_flag(0, depth(), flag())) {
    return next_flag;
}

template ()) ) ? +1 : -1]>
int constexpr binary_search_flag(int,   depth<0>, flag) {
    return N + 1;
}

template 
int constexpr binary_search_flag(float, depth<0>, flag) {
    return N;
}

// The actual expression to call for increasing the count.
template(),
        flag<(1 << (MAX_DEPTH-1))>())>
int constexpr counter_id(int value = mark::value) {
    return value;
}

static constexpr int a = counter_id();
static constexpr int b = counter_id();
static constexpr int c = counter_id();

#include 

int main () {
    std::cout << "Value a: " << a << std::endl;
    std::cout << "Value b: " << b << std::endl;
    std::cout << "Value c: " << c << std::endl;
}

2
задан user1159290 18 January 2019 в 09:18
поделиться

1 ответ

Дело обстоит так в Spyder 3.3.2 в Windows также. К сожалению, это - известное поведение в ipdb и не будет разрешено, пока Spyder 4 не выпущен позже в этом году. Для получения дополнительной информации см. официальная проблема о Github.

0
ответ дан Joe 7 April 2019 в 14:36
поделиться
Другие вопросы по тегам:

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