Что такое шаблон <typename T, T t> idiom?
Я читал этот и пытался понять, о чем говорилось N3601. Он сказал, что эта идиома очень много в веб-поиске, но я ничего не мог найти. Что такое
template<typename T, T t>
idiom, что он решает, как он используется, что такое параметры неявного шаблона и что цель намерена исправить?
Ответы
Ответ 1
Задача, которая решается, заключается в выводе типов из нестандартных параметров шаблона.
Дано:
template<typename T> void foo(T);
template<typename T, T> void bar();
можно вывести T
для foo
(например, foo(10)
приведет к тому, что T
будет выведено как int
), но вывести T
для bar
(bar<10>()
будет просто не компилироваться, вы должны записать его как bar<int,10>()
).
N3601 предлагает исправить это, введя синтаксис:
template<using typename T, T> void bar();
который позволит bar<10>()
скомпилировать и вывести тип T
.
Ответ 2
Введение в документ вводит в заблуждение: идиома на самом деле
template <typename T, T t>
Он обозначает шаблон, который зависит от типа T
и значения T
этого типа. Обозначение немного тяжело, поскольку в большинстве случаев тип может быть выведен из самого значения.
например.
// the current definition notation
template <typename T, T t> void f() { t.f(); };
//// the proposed definition notation
//// the parameter t depends on an implicit typename parameter T
// template <using typename T, T t> void f() { t.f(); };
struct foo {
void f(){
// some computation
}
};
foo bar;
int main(){
// the current instantiation notation
f<foo,bar>();
//// the proposed instantiation notation
//// we know that bar is of type foo, so we don't need to specify it
// f<bar>();
}
Предложение состоит в том, чтобы ввести немного "синтаксического сахара", чтобы сделать запись более легкой для записи.
Кроме того, приведенный выше пример является тривиальным в его описании (и, возможно, неправильным, поскольку параметры шаблона должны быть constexpr
), но в документе описаны несколько ситуаций, когда текущая нотация может стать довольно волосатой, снижая читаемость и общую непринужденность программирования.