Хорошо, то, что я пытаюсь сделать, довольно сложно, но я постараюсь объяснить.
Допустим, мы хотим (во время компиляции) все derivedMembers
класса someClass
. Тогда мы просто сделали бы:
const string[] methods = [__traits(derivedMembers,someClass)];
Итак, как мы могли получить someClass
от "someClass"
? (да, его строковое представление).
Позвольте мне немного подробнее объяснить, что я пытаюсь сделать:
Я хочу создать «промежуточную» функцию, которая принимает имя function
в качестве аргумента (вместе с массивом params) и вызывает соответствующую функцию из списка доступных статических методов в конкретном (предопределенном) наборе классов. Вроде execute("someFunc",["one","two","three"]);
.
Вот полный (тестовый) код:
class Math {
static string noArgs(string[] s) { writeln(s); return ""; }
static string withOneArg(string[] s) { writeln(s); return ""; }
static string withTwoArgs(string[] s) { writeln(s); return ""; }
}
string cases()
{
string ret = "";
const string[] methods = [__traits(derivedMembers,Math)];
foreach (string s; methods)
{
ret ~= "case \"" ~ s ~ "\": return Math."~s~"(params);";
}
return ret;
}
string execute(string what, string[] params)
{
switch (what)
{
mixin(cases());
default: break;
}
return "";
}
Проблема с приведенным выше кодом заключается в том, что он ищет методы только в Math
. Как я могу изменить его элегантным D-дружественным способом, чтобы он проходил через массив классов, таких как [Math,String,SomethingElse]
- он не обязательно должен быть переменным (нам это все равно нужно во время компиляции)?
ОБНОВЛЕНИЕ:
Пробовал что-то вроде:
const string[] methods = [__traits(derivedMembers,mixin("Math")];
но он жалуется, что Cannot interpret Math at compile time
.
ОБНОВЛЕНИЕ 2:
Кроме того, пробовал использовать Object.factory("Math")
, но он все еще не работает. (Возможно, я просто создаю экземпляр класса Math
?)
Object.factory("com.example.kameleon.Math");
? - person DejanLekic   schedule 15.04.2014mixin(className)
(который, наконец, сработал). Однако все равно это не нормально. Посмотрите здесь: stackoverflow.com/questions / 23078009 / use-a-loop-at-compile-time - person Dr.Kameleon   schedule 15.04.2014