Если вы хотите сделать действительно безобразным, вы можете выполнить практически все. Я отвечаю только потому, что это дразнилка для мозга.
Вы можете определить макрос следующим образом:
#define some_func(a) for(static auto f = create_foo(); some_func(a, f), false;)
Да, это будет работать. В стандартном C ++ предложение init цикла for может содержать объявление статической переменной. Таким образом, переменная будет инициализирована только один раз. Тогда «условие» - это фактический вызов some_func
, за которым следует оператор запятой с false
, поэтому функция выполняется только один раз при каждом входе в цикл for.
Адаптация вашего кода из Arduino к стандартному C ++ и симуляция четырех циклов привела к тому же результату, который вы хотели. Смотрите это в прямом эфире .
В качестве альтернативы, если вы хотите казаться немного менее загадочным (но с чего бы это?), вы можете выбрать следующее:
#define some_func(a) do {static auto f = create_foo(); some_func(a, f); } while(0)
То же самое на самом деле.
Хорошо, применение этого к вашей реальной проблеме требует чего-то другого:
#define debounce(a) [](int v){static Debounce d = create_debounce(); \
return debounce(d, v); }(a)
Это определяет и немедленно вызывает лямбду. Поскольку лямбда-выражение создает уникальный тип замыкания везде, где он появляется в программе, это создаст уникальный статический объект для каждого выражения, в которое вы пишете debounce(...)
. Альтернативой является специальное выражение оператора GCC. Но в отличие от лямбды, это расширение. Который вы можете или не можете использовать, YMMV.
Если вы хотите установить начальное значение по умолчанию, вы должны определить initial
, как и другие поля формы, за исключением того, что вы устанавливаете для него идентификатор вместо .
Допустим, у вас есть field1
, например:
class YourForm(forms.Form):
field1 = forms.ModelChoiceField(queryset = MyModel.objects.all() )
, тогда вам нужно установить initial, когда вы создаете форму, например:
form = YourForm(initial = {'field1': instance_of_mymodel.pk })
, а не:
form = YourForm(initial = {'field1': instance_of_mymodel })
Я также предполагаю, что вы определили __ unicode __
для своих моделей, чтобы это отображалось правильно.
field1 = forms.ModelChoiceField(queryset=Model.objects.all(), empty_label="Selected value")
Это столь же просто как это....!