Идеи для C++1y: шаблоны
От: NeoCode  
Дата: 15.11.13 08:36
Оценка: +1 -2
Современный С++ (особенно boost и все метапрограмминговые навороты) очень активно использует шаблоны (бывает, читаешь здесь посты некоторых форумчан — и не понимаешь на каком языке примеры кода написаны )
Ну и я подумал: а почему собственно не расширить возможности шаблонов, приблизив их еще немножко к синтаксическим макросам? Может быть, и язык станет проще и понятнее.

1. Сейчас параметрами шаблонов могут быть или типы, или целочисленные константы. Почему только они?
Очевидно, что параметрами шаблонов легко могут быть и любые другие константы: с плавающей точкой, символы, строки.
Возможно это менее очевидно, но также параметрами шаблонов могут быть любые имена (идентификаторы): имена функций и методов, имена переменных, просто любые корректные идентификаторы (не обязательно объявленные где либо). При инстанцировании эти имена подставляются в шаблон и код компилируется. Если имя в точке инстанцирования не доступно — обычная ошибка.
Ну и наконец, кроме имен, вполне можно передавать как параметры любые корректные фрагменты кода. Эти фрагменты можно собирать внутри шаблонов, вставлять их в код просто как аргменты макроса. Собственно, это есть обобщение передачи имен: передаем фрагменты синтаксических деревьев, имена — частный случай.

2. Сами шаблоны могут быть или шаблонными функциями, или шаблонными классами. При программировании для микроконтроллеров возникала необходимость "кода с параметрами", не функции, а просто корректный фрагмента кода, который можно просто вставить в другой код без всяких вызовов функций (как макрос). Собственно, и делалось это на сишных макросах, но на макросах ввиду того что они все-же лексические а не синтаксические, получалось громоздко и некрасиво.

Есть ключевое слово inline, используемое как модификатор функции. Предлагаю использовать его как самостоятельное ключевое слово для обозначения параметров шаблонов, являющихся не типами и не константами, а также и самих шаблонов.

Если собрать все вместе, получится примерно такое:
// объявление
template<int N, inline loop_body>
inline MyLoop
{
  for(int i=0; i<N; i++)
    loop_body;
}

// использование
MyLoop<100, { cout<<"Hello world"<<endl; } >;


Пример конечно примитивный, поэтому сразу может придти мысль "зачем все это?", но думаю разработчики буста и подобных библиотек, а также и прикладные программисты нашли бы этой возможности достойное применение в более сложных задачах. Что думаете?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.