Подтвердить что ты не робот

Что такое шаблон <typename T, T t> idiom?

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

template<typename T, T t>

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

4b9b3361

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