Что такое шаблон & lt; typename T, T t & gt; идиома?

я читал этот и пытался понять, что N3601 было около. Он сказал, что эта идиома часто встречается в веб-поиске, но я ничего не смог найти. Что

template<typename T, T t>

идиома, что она решает, как она используется, каковы неявные параметры шаблона, и что цель предложения исправить?

21

Решение

Решаемая проблема — вывод типов из шаблонных нетиповых параметров.

Дано:

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 быть выведенным.

15

Другие решения

Введение в бумагу вводит в заблуждение: идиома на самом деле

 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), но в статье описывается несколько ситуаций, когда текущая запись может стать довольно волосатой, что снижает удобочитаемость и упрощает программирование.

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector