Но можем ли мы передать вместо "auto" параметр типа шаблона, определенный слева?
Конечно.Это старый способ.
Но способ auto
позволяет избежать передачи типа A
.
В C ++ 17 вы можете написать
template <auto B>
class C {
public:
auto foo() { return B; }
};
поэтому нет необходимости передавать тип A
.
Я не знаю, как сделать то же самое в C ++ 11 / C ++ 14.
Я имею в виду: если вы хотите, в C ++ 11 / C ++ 14 передать значение в шаблон ... если тип является фиксированным, нет проблем
template <int I>
, но сам тип может отличатьсяв C ++ 11 / C ++ 14 вы должны сначала передать тип, а затем значение, как в вашем примере .cpp
template <typename T, T A>
По-старому проблема заключается в том, что если вы хотитечтобы вызвать этот тип шаблона, вы должны быть избыточны и написать что-то как
C<decltype(x), x> some_C_variable;
, и единственный известный мне способ избежать этой избыточности - это пройти через функцию make (что-то вроде make_tuple()
) илиМакрос в стиле C.
В C ++ 17 вы можете просто написать
C<x> some_C_variable
, а внутри класса / структуры шаблона C тип x
можно получить из decltype(B)
.
Для стандартных ссылок C ++ 17 ...
Прежде всего, auto
определяется как "placeolder"
От 10.1.7.4 (auto
спецификатор), точка 1
Спецификаторы типа auto
и decltype(auto)
используются для обозначения типа заполнителя, который позднее будет заменен вычетом из инициализатора..
Это также верно для C ++ 11 / C ++ 14
Но стандартное добавление C ++ 17 для "Параметры шаблона" (17.1) в пункте 4Перечень, новый пункт 4.6
Нетипичный
шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:
[...]
(4.6) тип, который содержит тип заполнителя (10.1.7.4)