я читал этот и пытался понять, что N3601 было около. Он сказал, что эта идиома часто встречается в веб-поиске, но я ничего не смог найти. Что
template<typename T, T t>
идиома, что она решает, как она используется, каковы неявные параметры шаблона, и что цель предложения исправить?
Решаемая проблема — вывод типов из шаблонных нетиповых параметров.
Дано:
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
быть выведенным.
Введение в бумагу вводит в заблуждение: идиома на самом деле
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
), но в статье описывается несколько ситуаций, когда текущая запись может стать довольно волосатой, что снижает удобочитаемость и упрощает программирование.