Я работал с шаблоном, который принимает набор целых чисел. Код был похож,
template<unsigned... Idx>
struct work{ ... };
Тогда я понял, пользователю может потребоваться либо набор целых чисел, либо диапазон целых чисел. Итак, я немного изменил синтаксис для поддержки создания экземпляра, например,
work<indexes<1,3,2,4> > //instead of work<1,3,2,4>
work<span<1,4> > //same as work<1,2,3,4>
В то время как в С++ у нас есть большое количество операторов, и их можно использовать для формулировки шаблонов экзотических выражений (например, boost::xpressive
, boost::lambda
, boost::spirit
и т.д.), возможности манипуляции типа намного меньше.
В лейбле boostcon от Sean Parent он отметил, что еще не может написать pair<int>
для обозначения a pair of integers
. В моей персистентной библиотеке я сделал такой синтаксис, как tuple<int[3]>
, чтобы обозначить кортеж из трех целых чисел, вместо того, чтобы писать кортеж с 3 int в аргументах типа, отметив, что я не пишу необработанный массив в качестве аргумента кортежа в любом месте! (примечание: std::array<int,3>
не то же самое, что и выше, поскольку std:: array не может хранить ссылки, а tuple
может, скажем, std::tuple<int&,int&,int&>
)
Итак, я хочу знать, каковы разные типы выражений типа, которые я могу написать?
До сих пор я могу думать о типе объекта, типе функции, ссылочном типе, с/без модификаторов cv, указателях и т.д., например
template<class T>
struct tpl;
using t1 = tpl<int>;//simple type
//function (can have function pointer/reference also)
// e.g. void(*)(int,float) or void(&)(int,float)
using t2 = tpl<void(int,float)>;
//array can have pointer / reference also
//e.g. int(&)[4] or int (*)[4]
using t3 = tpl<int[4]>;
using t4 = tpl<int[]>;
using t5 = tpl<int const>;//with cv modifiers
using t6 = tpl<int*>;//with pointer
using t7 = tpl<int&>;//with reference (& or &&)
using t8 = tpl<tpl<int> >; //template itself
using t9 = tpl<void(...)>; //variadic functions
using t10 = tpl<R C::*>; //pointer to member
Но я верю, что многое другое возможно.
ПРИМЕЧАНИЕ. Этот вопрос является чисто теоретическим, Я просто хочу знать все виды синтаксиса, которые я могу написать внутри < > как аргумент типа, а не о его аспекте читабельности/нравственности, или даже как я могу реализовать некоторые из приведенных мной примеров, например класс работы.