Выход из безопасности с помощью отладочных операторов

Я знаю

debug writeln("Some good debug message")

в pure функции, но как насчет функций, которые я тщательно пометил как @safe или же @trusted? DMD в настоящее время не позволяет debug writelnв тех, потому что writeln и аналогичные в настоящее время @system, Это ИМХО очень расстраивает. Есть ли умный способ избежать безопасности или я должен временно закомментировать все мои @safe а также @trusted теги?

2 ответа

Решение

Что я делаю, так это делаю свой собственный @trusted debug_writeln.

@trusted void debug_writeln(T...)(T t) {
      import std.stdio;
      writeln(t);
}

Поскольку это @trusted, он будет работать внутри функций @safe без каких-либо изменений. Вы также можете просто назвать его writeln, а затем не импортировать std.stdio или псевдоним для принудительного устранения неоднозначности.

Универсальное решение

import std.stdio;

void main () @safe pure
{
    auto str = trustedPureDebugCall!readln();
    trustedPureDebugCall!writeln(str);
}

debug auto trustedPureDebugCall (alias fn, A...) (A args) @trusted pure
{
     debug return fn(args);
}
Другие вопросы по тегам