Проверка подписей функций с помощью ParameterTypeTuple - PullRequest
2 голосов
/ 01 августа 2010

Я пишу модуль с шаблонами 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 волшебники?

1 Ответ

1 голос
/ 01 августа 2010

Вы можете попробовать сравнить его с типом функции:

enum isMainArgTypes = is(typeof(&main) == int function()) || 
                      is(typeof(&main) == void function()) || 
                      is(typeof(&main) == int function(string[])) || 
                      is(typeof(&main) == void function(string[]));

Не короче, но выглядит чище, поскольку не нужно static if

...