Приветствую все читающих. О чём статья (или задача статьи): практический ответ на вопрос "возможно ли создать большой проект так, чтобы полностью отказаться от dynamic_cast на этапе выполнения?", где под большим проектом подразумевает такой в котором уже нет человека, что бы…
Иногда, при реализации очередной "шаблонной магии" очень хочется на этапе компиляции иметь сакральное знание о том, а если у типа нужный метод, чтобы его вызвать или нет?Хорошо, если есть поддержка концептов или рефлексии. А что делать, если их ещё нет, или они не в полной мере поддерживаются?В этой статье хотелось бы кратко рассмотреть особенности применения известного механизма обнаружения наличия функциональности у используемых типов данных на этапе компиляции. Читать далее
А что, если бы операции List[A].head и List[A].tail в Scala были бы безопасными на этапе компиляции?В один ноябрьский вечер я задался этим вопросом, и, обладая нулевыми знаниями по метапрограммированию, принялся реализовывать список SList[A, N] с известным на этапе компиляции размером. Даже for-comprehension в итоге получилось реализовать!Как это получилось сделать и какими средствами языка? Если рассказывать подробно - долгая история. Хочу обрести мета-силу!
Если вы программируете на C++, то наверняка задавались вопросом почему нельзя сравнить два строковых литерала или выполнить их конкатенацию: auto str = "hello" + "world"; // ошибка компиляции if ("hello" < "world") { // компилируется, но работает не так, как ожидалось // ... } Впрочем, как говорится, "нельзя, но если очень хочется, то можно". Ломать стереотипы будем под катом, причем прямо на этапе компиляции. Читать дальше →