D извлечение типа функции времени компиляции - PullRequest
3 голосов
/ 18 ноября 2011

D2.056

Функция - это структура, содержащая имя и тип функции (соответственно Имя и Тип).Binds перебирает список структур Function и возвращает строку mixin.Этот миксин определяет для каждой функции новое имя с добавлением «2».

void f() { writeln("f"); }
void g() { writeln("g"); }

struct Function(string name, Prototype)
{
    const string Name = name;
    mixin("alias Prototype Type;");
}

string Binds(Functions...)()
{
    string r;
    foreach (F; Functions)
    {
        // error:
        r ~= to!string(typeid(F.Type)) ~ " " ~ F.Name ~ "2 = &" ~ F.Name ~ ";";
    }
    return r;
}

int main()
{
    mixin (Binds!(
                 Function!("f", void function()),
                 Function!("g", void function())        
                 ));

    f();
    //f2();

    return 0;
}

При компиляции to!string(typeid(F.Type)) выдает ошибку:

Error: Cannot interpret & D13TypeInfo_PFZv6__initZ at compile time
   called from here: to(& D13TypeInfo_PFZv6__initZ)
   called from here: Binds()

Во-первых, я нене понимаю, почему требуется явное преобразование в строку (не является ли typeid строкой, если нет, в чем разница между typeid и typeof?).

Во-вторых, я не могу понять, как получитьЯвный тип функции записан так, что он может быть выполнен в main.Я не могу использовать F.Type, поскольку он является локальным для foreach.

1 Ответ

2 голосов
/ 18 ноября 2011

У вас здесь пара проблем, но главная из них заключается в том, что typeid возвращает объект типа TypeInfo ( выражение typeid ). К счастью, вы можете просто использовать F.Type.stringof. Также обратите внимание, что вам не нужен mixin для псевдонима Prototype как Type:

void f() { writeln("f"); }
void g() { writeln("g"); }

struct Function(string name, Prototype)
{
    const string Name = name;
    alias Prototype Type;
}

string Binds(Functions...)()
{
    string r;
    foreach (F; Functions)
    {
        // error:
        r ~= F.Type.stringof ~ " " ~ F.Name ~ "2 = &" ~ F.Name ~ ";";
    }
    return r;
}

import std.stdio,
    std.conv;
int main()
{
    mixin (Binds!(
                 Function!("f", void function()),
                 Function!("g", void function())        
                 ));

    f();
    f2();

    return 0;
}

Запуск этой печати:

f
f

что я считаю, это то, что вы ищете.

...