2:23p |
Эмо на дорогах В Израиле, помнится, меня восторгали лошадки, запряженные в телеги, шагающие по крупнейшим автомагистралям (ну раз так в 5 лет попадались), а вот в Канаде сегодня попался мне на хайвее натуральный розовый трак. В кабине, как ни странно, сидел мужик. |
6:13p |
если б мишки были пчелами Если бы каждая целочисленная константа-литерал имела собственный тип, то можно было бы написать функцию, принимающую только данное константное значение в качестве аргумента. Это бы, в свою очередь, позволило писать функции, которые бы часть своих аргументов принимали бы по константному значению, известному в compile-time, и использовали это значение для генерации специализации.
Что-то подобное можно и сегодня попробовать:
template <typename Arg1, typename Arg2, typename Arg3> void f(Arg1 a1, Arg2 a2, Arg3::type a3);
При этом, скажем, типы Arg1 и Arg2 - что-то вроде ConstIntType<12> и ConstIntType<8>, имея в виду передать 12 и 8 как первый и второй аргумент функции, ну а Arg3 пусть будет просто int. Дальше уже дело компилятора - использовать знание о константности двух первых аргументов для генерации кода конкретной специализации.
Ну, если надо, и сами partial-специализацию напишем, темплейтной функции. Впрочем, там у вас в С++ специализаций темплейтных функций нет, ну так и хрен с вами:
template <int arg1, int arg2> void f(ConstIntType<arg1> arg1dummy, ConstIntType<arg2> arg2dummy, int arg3) { ... }
Из чего, собственно, видно, что разделение параметров темплейта и параметров функции может быть довольно условным. |