Очевидно, что параметры шаблона, не являющиеся типами, не являются типами, например:
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