Шаблони як параметри шаблону

Є в шаблонах С ++ цікава можливість параметризованих самі параметри шаблонів. Щоб це могло означати?

Бувають випадки, коли параметр шаблону сам є шаблонною класом і для його інстанцірованія теж потрібно вказати параметр. Наприклад, універсальна шаблонна функція для друку стандартного контейнера будь-якого типу в потік:

І все б нічого, але з тільки зору синтаксису С ++ це невірно. Не можна просто написати C. якщо E сам є не певним типом, а параметром шаблону. Правильний спосіб використання параметра шаблона, який в свою чергу залежить від іншого параметра, повинен виглядати так:

Тепер повний приклад (template_parameter.cpp):

І запускаємо скомпільований файл:

Чітко видно, що на першому рядку роздруковані цілі, на другий речові, на третій символи, і на четвертій рядки.

template_as_parameter.cpp (38). error C3208: 'print'. template parameter list for class template 'std :: vector' does not match template parameter list for template template parameter 'C'

З чого я зробив висновок, що мікрософтовскій компілятор не підтримує подібний синтаксис.

Я був дуже засмучений подібним фактом, так як в цілому дуже позитивно ставлюся до cl.exe. А тут виходить, що навіть борландовий компілятор це розуміє, а cl.exe немає. Якщо хто знає, може є ключик який секретний для включення підтримки "хитрих і рідкісних" можливостей С ++ в компіляторі Мікрософтвера - навчіть, будь ласка. Буду дуже вдячний.

Передбачаючи питання типу "навіщо так складно, та ще й погано переносимо" - все вірно. Особисто я б відніс все вище описане до "темних кутках" С ++, але аж надто цікаво за ними полазити.

У шаблонів стандартних контейнерів є другий параметр, так званий allocator. Цей параметр часто використовується із значенням за замовчуванням, тому рідко доводиться згадувати про нього. І як уточнив Олександр, моя проблема була в тому, що cl.exe вимагає явної вказівки наявності цього параметра при параметризації параметра C.

Виправлений код компілюється у всіх випробуваних компіляторах, тепер включаючи і cl.exe.

Інші пости по темі: