Я довольно новичок в Boost MPL (и мета-программировании в целом), и я думаю, что меня смущает идея шаблонов и типов. Простым примером, с которым я работаю, является попытка вычислить длину вектора. Следующий отлично компилируется:Boost MPL Types Vs Templates
typedef mpl::vector_c< int, 0, 1, 2, 3, 4, 5, 6, 7 > myVector;
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
};
};
typedef TestSize::apply<myVector>::type result;
, но если добавить «:: типа» к результату вычисления размера, как это:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence>::type type;
};
};
typedef TestSize::apply<myVector>::type result;
тогда я получаю сообщение об ошибке «Ошибка: нетиповая» подталкивание :: mpl :: size :: type [with Sequence = mySequence] "не является именем типа".
Это ситуация, когда параметр шаблона не выводится, потому что он находится в вложенном пространстве имен? Добавление к моей путаницы является тот факт, что следующие компилирует:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
typedef mpl::range_c<int, 0, type::type::value> myRange;
};
};
typedef TestSize::apply<myVector>::type result;
typedef TestSize::apply<textureIndices>::myRange range;
Почему я могу сделать «тип :: Тип :: Значение» там, но не «размер < mySequence> :: тип» на линии раньше?
@ user1777820, вы только что открыли такую коробку Пандоры! Короче говоря, причина в том, что 'mpl :: size :: type' является * зависимым от шаблона * именем. Сематик 'type' будет отличаться от того, что на самом деле есть' T', это может быть функция, тип, переменная ... Все. С другой стороны, семантика 'size ' не зависит от 'T' - независимо от того, что такое' T', 'size ' - это только одно - это создание шаблона ранее определенного класса шаблона 'size'. Нет двусмысленности, поэтому не нужно намекать. –
SergeyA
Я удалил свой комментарий, так как я собирался начать новый вопрос, поэтому я добавляю его для тех, кто читает это в будущем. Я спрашивал, как решение здесь, используя подсказку typename, отличается от моего первого примера кода строкой «typedef mpl :: size type;» который компилируется отлично. Спасибо @SergeyA! –
user1777820