Здравствуйте, WolfHound, Вы писали:
_>>Это мне ни о чём не говорит. ) Нужен пример кода и пояснение его работы на русском (или английском) языке.
WH>https://github.com/rsdn/nemerle/wiki/Record-macro
Ха, ну так это же и так есть в самом C/C++:
struct Person{
string name;
int age;
bool sex;
};
Person person{"name", 1, true};//компилируется нормально
Однако я конечно же понял задачу — сделать тоже самое, только средствами МП. Тоже легко делается, но естественно только при наличие в языке нормальной интроспекции, как я уже неоднократно отмечал. Ну предположим что она уже есть (или же мы прибегли к извращению со скобочками из boost'a)... Тогда всё делается без проблем:
struct Animal{
string name;
};
struct Cat: public Animal{
int fur;
declare_ctor(Cat);//добавляется одна коротенькая строка, как и в Немерле
};
Cat cat{"name", 1};
cout<<cat.name<<' '<<cat.fur<<endl;//выводит "name 1"
где реализация данной функциональности выглядит так (по простому, даже без всяких удобностей из boost.fusion):
template<int N, typename S, typename T> void _ctor(S& s, T value) {field_at<N>(s)=value;}
template<int N=0, typename S, typename T, typename... Args> void _ctor(S& s, T value, Args... args) {field_at<N>(s)=value; _ctor<N+1>(s, args...);}
#define declare_ctor(Name) template<typename... Args> Name(Args... args) {_ctor(*this, args...);}
Ну и для тестирования работоспособности примера мы можем использовать такую эмуляцию интроспекции (подразумевается что в нормальном случае её реализует компилятор или в худшем случае генерируют какие-то макросы, но мне лень возиться с этим):
template<int N, typename S>auto& field_at(S& s);
template<> auto& field_at<0, Cat>(Cat& c) {return c.name;}
template<> auto& field_at<1, Cat>(Cat& c) {return c.fur;}
В общем ничего сложного в данной задаче не вижу. Да, здесь не реализована фильтрации (exclude список), как в Record, но очевидно что это тоже легко добавляется — просто при итерации пропускаем (вызовем
_ctor<N+1>(s, value, args...) вместо
_ctor<N+1>(s, args...)) соответствующие поля. Так что можно углублять настройки насколько угодно далеко.
P.S. Хочу заметить, что лично я не считаю МП в C++ особо сильным — в том же D намного сильнее и красивее. Но как-то так получается, что эти твои типа модные примеры на самом деле реализуются даже на простеньком МП из C++...
P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого
http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.