C++ два или больше типа данных в объявлении

Вы можете использовать бесконечный цикл, который имеет условие разрыва. Таким образом, в конце вашего кода у вас будет что-то вроде:

while checkIfProcessRunning('discord'):
    print('Discord is running')
print('Discord is NOT running')

Это будет работать, непрерывно вызывая checkIfProcessRunning('discord'). Если он возвращает True, то он продолжает цикл и проверяет снова. Когда вы вернете False, цикл прервется.

Тем не менее, будет напечатано много Discord is running, так что вы можете захотеть использовать какой-либо метод сна в этом цикле, чтобы проверять только каждые 5 секунд или некоторое количество времени, например:

from time import sleep

while checkIfProcessRunning('discord'):
    print('Discord is running')
    sleep(5)
print('Discord is NOT running')
6
задан Dan Hook 21 April 2010 в 12:35
поделиться

3 ответа

Выбранный ответ от CAdaker выше решает проблему, но не объясняет, почему это решает проблему.

Когда шаблон функции анализируется, поиск не происходит в зависимых типах. В результате конструкции, такие как следующее могут быть проанализированы:

template <typename T>
class B;

template <typename T>
void foo (B<T> & b) {
  // Use 'b' here, even though 'B' not defined
}

template <typename T>
class B
{
  // Define 'B' here.
};

Однако эта "функция" имеет стоимость, и в этом случае случается так, что определение 'нечто' требует подсказок на содержании шаблона 'B'. Если 'нечто' использует вложенный тип 'B', то typename ключевое слово требуется, чтобы говорить компилятору, что имя является типом:

template <typename T>
void foo (B<T> & b)
{
  typename B<T>::X t1;    // 'X' is a type - this declares t1
  B<T>::Y * t1;           // 'Y' is an object - this is multiplication
}

Без 'имени типа' в выше компилятора примет это X объект (или функция).

Точно так же, если функцию членства называют, и вызов имеет явные аргументы шаблона затем, компилятор должен знать для обработки < как запуск списка аргумента шаблона а не меньше, чем оператор:

template <typename T>
void foo (B<T> & b)
{
  b.template bar<int> (0); // 'bar' is a template, '<' is start of arg list
  b.Y < 10;                // 'Y' is an object, '<' is less than operator
}

Без template, компилятор принимает это < меньше, чем оператор и так генерирует синтаксическую ошибку, когда это видит int> так как это не выражение.

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

template <typename T>
class B
{
  template <typename S>
  void a();
};

template <typename T>
void foo (B<T> & b)
{
  b.a < 10;            // 'B<int>::a' is a member object
}

template <>
class B<int>
{
  int a;
};
10
ответ дан 8 December 2019 в 12:24
поделиться

Используйте любого просто

original.to_string();

или, если Вам действительно нужны спецификаторы типа,

original.template to_string<char, char_traits<char>, allocator<char> >();
7
ответ дан 8 December 2019 в 12:24
поделиться

Следующее скомпилировано для меня (использующий gcc 3.4.4):

#include <bitset>
#include <string>

using namespace std;

template <int N, int M> 
bitset<N> slice_bitset(const bitset<M> &original, size_t start) 
{   
  string str = original.to_string();
  string newstr = str.substr(start, N);    
  return bitset<N>(newstr);
}

int main() 
{ 
  return 0; 
}
2
ответ дан 8 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

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