Очевидно, что параметры шаблона, не являющиеся типами, не являются типами, например:
template<int x>
void foo() { cout << x; }
В этом случае есть другие варианты, кроме int
, и я хотел бы сослаться на этот отличный ответ.
Меня беспокоит одна вещь: структуры. Учитывать:
struct Triple { int x, y, z; };
Triple t { 1, 2, 3 };
template<Triple const& t>
class Foo { };
Теперь, используя обычную семантику не типовых ссылок, мы можем написать:
Foo<t> f;
Здесь стоит отметить, что t
не может быть constexpr
или даже const
, потому что это подразумевает внутреннюю привязку, что в основном означает, что строка не будет компилироваться. Мы можем обойти это, объявив t
как const extern
. Само по себе это может показаться немного странным, но меня действительно заставило задуматься, почему это невозможно:
Foo<Triple { 1, 2, 3 }> f;
Мы получаем действительно приличную ошибку от компилятора:
ошибка:
Triple{1, 2, 3}
не является допустимым аргументом шаблона для типаconst Triple&
, потому что это не lvalue.
Мы не можем указать Triple
в шаблоне по значению, потому что это запрещено. Однако я не могу понять настоящую проблему с этой маленькой строчкой кода. В чем причина запрета использования структур в качестве параметров значения. Если я могу использовать три int
, почему бы не структуру из трех целых чисел? Если он имеет только тривиальные специальные члены, он не должен сильно отличаться от обработки трех переменных.
meta_triple
- потрясающее творение. И это действительно хорошо решает мои проблемы. 09.04.2013Triple
вmeta_triple
? 25.10.2016