[C++] Частичное уточнение шаблона

buka

Хочется сделать шаблон <int a, int b>, а потом уточнить до <int a, 0>. Что-то вроде такого:


template <int a, int b> int f { return f<a, b-1> }
template <int a> int f<a, 0> { return a; }


Какой-нибудь компилятор это поддерживает? (Желательно и внутри другого шаблона...)

bobby

имхо, gcc 3 и msvc 7 тянут такое.
P.S. я имею ввиду, что вообще gcc3 и msvc 7 поддерживают частичное уточнение шаблона.
зачем оно нужно конкретно в твоем коде, мне не очень ясно

tipnote

Может, в данном случае лучше значение по умолчанию использовать?

buka

«msvc 7» не тянет точно, как и многое другое... А вот GCC может нужно настроить... а так «partial specialization `f<a, 0>' of function template» отвечает.

buka

Для вышеуказанного примера сообразить обход через параметр по умолчанию не могу...

tipnote

template <int a, int b=0> int f
{
if(!b)
return a;
return f<a, b-1>
}

bobby

а блин, msvc7 умеет только классовые темплейты частично специализировать.

buka

Гы-гы. Если с if, так и без шаблонов можно! В том-то и соль, чтоб макросредствами сделать.
Хотя может соптимизирует... =)

tipnote

Не понимаю, почему два шаблона лучше. В этой ситуации. "Без" будет менее удобно использовать.
Но в данном случае, я не прав. Гцц не дает юзать дефолтные значения у шаблонов функций.

buba741

template <int a, int b> int f { return f<a, b-1> }
template <int a> int f<a, 0> { return a; }
Напиши лучше, что за задачу ты таким спопобом пытаешься решать.

buka

Ну, к примеру, перебор подстановок. Хочу типы, представляющие понятия «выборка k из n» и «выборка k из n, когда m выбрано», при этом k и m заданы до компиляции. Выбор осуществляется по-разному, но согласование с уже выбранным единообразно. Все работало, но появилась идея оформить их одним шаблоном.

bastii

vc++ 2005 тянет

oleg_mcp

Кстати, где фанат С++ ? Пусть объяснит, почему столь древняя фишка, как частичное определение шаблона, будет реализована только в 2005 компиляторе. А ведь VC++ один из самых (если не самый) популярных компиляторов С++ под виндами.
Сдается мне, что тут дело вовсе не в чудовищной сложности языка, благодаря которой практически невозможно создать быстрый и надежный компилятор полностью реализующий стандарт, а в происках злобного Б.Гейтса, ненавистника С++ и любителя бейсика.

anzakaznov

не удивлюсь, если про это просто забыли %)
или не успели всрок доделать к выпуску релиза
именно последним, на мой взгляд, объясняется, например, отсутствие generic'ов в cs1.0

mirt1971

По-моему этого просто нет в стандарте

mirt1971

Кстати я не фанат С++. У этого языка очень много недостатков. Но мне нравится его мощь, выразительность и сложность(в хорошем смысле)

Dasar

1. отсутствие частичной специализации обходится через вложенные в друг друга классы
2. стандарт C++ с частичной специализацией был принят недавно - в 99-году
3. даже, примерно, в 2002 году единственным компилятором поддерживающим полностью стандарт был Comeau (это к слову о сложности).

mirt1971

3) А он export шаблонов умеет? Тогда респект ему.

bastii

думаю с последних версиях VC++ они были заняты прикручиванием дотНЕТ к языку

Dasar

AFAIK, он это еще в 2002 умел.
http://www.comeaucomputing.com/4.0/docs/userman/export.html
Оставить комментарий
Имя или ник:
Комментарий: