Я пишу модуль с шаблонами mixin для обеспечения функции main
для модульного тестирования.Использование выглядит следующим образом:
/* For modules without their own main, e.g. libraries.
* main is conditionally supplied using version(unittest).
*/
mixin Main;
/* For executable modules defining function "realMain".
* Generated main has the same signature and return type
* as realMain, and transfers control to it. Additionally,
* main exits without calling realMain for version (unittest).
*/
mixin Main!realMain;
Идея состоит в том, что каждый мой модуль смешивается в main
соответственно, так что:
- Библиотеки не
--main
необходимо передать rdmd
, потому что - Кажется, нет хорошего способа решить , а не передать
--main
для модулей, которые определяют свои собственные, при автоматическом запуске модульных тестов длякаждый файл в иерархии каталогов - код выхода из rdmd
такой же, как для неудачной компиляции.
Я использую std.traits
, чтобы определить валидность realMain
какmain
и убедитесь, что мой сгенерированный main
имеет такую же подпись.Кажется, все работает, но я думаю, что это может быть чище.В настоящее время мой шаблон для проверки допустимых аргументов main
выглядит следующим образом:
template isMainArgTypes(alias main)
{
static if (is(ParameterTypeTuple!main == TypeTuple!()))
enum isMainArgTypes = true;
else static if (ParameterTypeTuple!main.length == 1
&& is(ParameterTypeTuple!main[0] T : const T[]))
{
enum isMainArgTypes = is(T : const char[]);
}
else
enum isMainArgTypes = false;
}
Я уверен, что должен быть какой-то способ сконцентрировать среднее условие в одном выражении is
, без явного тестирования кортежадлина и отдельная проверка на строковый тип, но до сих пор мой зарождающийся метапрограммирующий фу потерпел неудачу.
Есть идеи, D волшебники?