Введение в статью вводит в заблуждение: идиома на самом деле
template <typename T, T t>
Он обозначает шаблон, который зависит от типа T
и значения t
этого типа. Обозначения немного тяжелы, поскольку в большинстве случаев тип может быть выведен из самого значения.
E.g.
// 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
), но в документе описывается несколько ситуаций, когда текущая нотация может стать довольно сложной, что снижает удобочитаемость и общую простоту программирования.
person
didierc
schedule
13.04.2013
template <typename T> void foo(T t);
. Сделайте этот параметр значением времени компиляции:template <typename T, T t> void bar();
(я думаю, вы имели в виду это вместоclass
). Теперь подумайте, как вы можете вызватьfoo(5);
, чтобы T былint
, но чтобы сделать это сbar
, вам понадобитсяbar<int, 5>();
. Это идет в правильном направлении? - person chris   schedule 13.04.2013