Mar. 28th, 2015

thedeemon: (office)
Добавил тут в одну программку простейшую конфигурацию: именованные параметры, загружаемые при первом обращении из текстового файла, и имеющие значения по-умолчанию на случай если файл конфигурации отсутствует или не содержит нужного значения. Потом заметил, что имена всех параметров указаны в исходниках, т.е. известны во время компиляции. А значит было бы неплохо прямо при компиляции убеждаться, что все запрашиваемые имена параметров верные, т.е. для каждого запрашиваемого параметра описано значение по-умолчанию, и нигде не будет ненароком запрошено что-нибудь неизвестное.

Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово enum). В начало функции добавляем static if с проверкой (осуществляемой при компиляции) на наличие запрашиваемого имени в том ассоц.массиве. Если не найдено, говорим ругаться при компиляции такими-то словами. Все.

string getOptionString(string name)() {
    static if (name !in defaults) {
        static assert(0, "unknown option name: " ~ name);
    }
    auto ops = getOptions();
    return ops[name];
}

private:

enum defaults = ["quantity": "large", 
                 "quality" : "high"];
...


Теперь если допустить очепятку и написать
string q = getOptionString!("quanlity");

то программа не компилируется, а компилятор пишет
options.d(5): Error: static assert  "unknown option name: quanlity"
main.d(210):        instantiated from here: getOptionString!"quanlity"


Мелочь, а приятно. За такие вот в том числе и люблю D.

Profile

thedeemon: (Default)
Dmitry Popov

July 2025

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930 31  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 1st, 2025 03:10 pm
Powered by Dreamwidth Studios