Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 15:15
Оценка:
Есть такой код:
class A : public B 
{
// ...
};

// ...

bool TestMethod(const B& value);
template<typename TYPE>
bool TestMethod(const TYPE& value);

// ...

A myclass;
TestMethod(myclass);

Результат — подставляется шаблонная. Почему? Искал в книгах и по форуму (в частности тут
Автор: Кодт
Дата: 11.02.08
) — ожидал другого порядка подстановки:

1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue)
2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета,
2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим
— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами
— 2.2) основной шаблон
3) функции с троеточием

Если я неправ и запутался, как мне заставить подставить не шаблонный вариант в моем случае?
Re: Перегрузка и специализация шаблона
От: denisko http://sdeniskos.blogspot.com/
Дата: 02.11.09 15:59
Оценка:
ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета
Нее, это создавало бы кучу проблема из-за предположений компилятора о выводимости типов.
<Подпись удалена модератором>
Re[2]: Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:04
Оценка:
Здравствуйте, denisko, Вы писали:

ATP>>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета

D>Нее, это создавало бы кучу проблема из-за предположений компилятора о выводимости типов.

— ну не знаю, это Кодт написал в ответ на похожий вопрос.
А как мне всетаки быть в моей ситуации?
Re[3]: Перегрузка и специализация шаблона
От: Lorenzo_LAMAS  
Дата: 02.11.09 16:19
Оценка:
ATP> — ну не знаю, это Кодт написал в ответ на похожий вопрос.
ATP>А как мне всетаки быть в моей ситуации?

явно кастить.
Of course, the code must be complete enough to compile and link.
Re: Перегрузка и специализация шаблона
От: Кодт Россия  
Дата: 02.11.09 16:30
Оценка: 11 (2)
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue)

ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета,
ATP>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим
ATP>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами
ATP>— 2.2) основной шаблон
ATP>3) функции с троеточием

Подстановка шаблона более приоритетна, чем статик-каст.

А чтобы решить конкретно твою ситуацию, нужно поиграться с диспетчеризацией
struct Base {};
struct Derived : Base {};
struct Other {};

// целевые функции
void foo_b(Base&) { cout << __PRETTY_FUNCTION__ << endl; }
template<class T> void foo_t(T&) { cout << __PRETTY_FUNCTION__ << endl; }

// обработчики
template<class T> void foo_(T& arg, Base*) { foo_b(arg); }
template<class T> void foo_(T& arg, void*) { foo_t(arg); }
// диспетчер
template<class T> void foo(T& arg) { foo_(arg, (T*)0); }

int main()
{
  Base b; Derived d; Other o;
  foo(b); // void foo_b(Base&)
  foo(d); // void foo_b(Base&)
  foo(o); // void foo_t(T&) [with T = Other]
}

http://codepad.org/I5aYk9yV

Можно ещё с enable_if, но там, если много перегрузок, будет избыток писанины.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: Перегрузка и специализация шаблона
От: Владислав Курмаз Украина http://tis-method.org/
Дата: 02.11.09 16:32
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Есть такой код:

ATP>
ATP>class A : public B 
ATP>{
ATP>// ...
ATP>};

ATP>// ...

ATP>bool TestMethod(const B& value);
ATP>template<typename TYPE>
ATP>bool TestMethod(const TYPE& value);

ATP>// ...

ATP>A myclass;
ATP>TestMethod(myclass);

ATP>

ATP>Результат — подставляется шаблонная. Почему? Искал в книгах и по форуму (в частности тут
Автор: Кодт
Дата: 11.02.08
) — ожидал другого порядка подстановки:


ATP>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue)

ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета,
ATP>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим
ATP>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами
ATP>— 2.2) основной шаблон
ATP>3) функции с троеточием

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


Здравствуйте.

Обсуждение этого вопроса можно найти здесь:
Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации"
"66.Не специализируйте шаблоны функций"

И на первый взляд, не соответствие стандарту.
В "Microsoft Visual Studio 2008" артефакт подтверждается.

С уважением,
Владислав Курмаз.
Re[4]: Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:34
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

ATP>> — ну не знаю, это Кодт написал в ответ на похожий вопрос.

ATP>>А как мне всетаки быть в моей ситуации?

L_L>явно кастить.


Странно как-то получается информация и типе на этапе компиляции есть, а воспользоваться я этим не могу никак, так что ли?
Re[2]: Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:38
Оценка:
Здравствуйте, Владислав Курмаз, Вы писали:

ВК>Обсуждение этого вопроса можно найти здесь:

ВК>Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации"
ВК>"66.Не специализируйте шаблоны функций"

ВК>И на первый взляд, не соответствие стандарту.

ВК>В "Microsoft Visual Studio 2008" артефакт подтверждается.

ВК>С уважением,

ВК>Владислав Курмаз.

А где у меня специализация шаблона?
Re[2]: Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:45
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue)

ATP>>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета,
ATP>>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим
ATP>>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами
ATP>>— 2.2) основной шаблон
ATP>>3) функции с троеточием

К>Подстановка шаблона более приоритетна, чем статик-каст.


Этот порядок из вашего поста

К>А чтобы решить конкретно твою ситуацию, нужно поиграться с диспетчеризацией

К>
К>struct Base {};
К>struct Derived : Base {};
К>struct Other {};

К>// целевые функции
К>void foo_b(Base&) { cout << __PRETTY_FUNCTION__ << endl; }
К>template<class T> void foo_t(T&) { cout << __PRETTY_FUNCTION__ << endl; }

К>// обработчики
К>template<class T> void foo_(T& arg, Base*) { foo_b(arg); }
К>template<class T> void foo_(T& arg, void*) { foo_t(arg); }
К>// диспетчер
К>template<class T> void foo(T& arg) { foo_(arg, (T*)0); }

К>int main()
К>{
К>  Base b; Derived d; Other o;
К>  foo(b); // void foo_b(Base&)
К>  foo(d); // void foo_b(Base&)
К>  foo(o); // void foo_t(T&) [with T = Other]
К>}
К>

К>http://codepad.org/I5aYk9yV

Идею уяснил — супер. Буду пытаться применить.
Re[3]: Перегрузка и специализация шаблона
От: Владислав Курмаз Украина http://tis-method.org/
Дата: 02.11.09 16:52
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>Здравствуйте, Владислав Курмаз, Вы писали:


ВК>>Обсуждение этого вопроса можно найти здесь:

ВК>>Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации"
ВК>>"66.Не специализируйте шаблоны функций"

ВК>>И на первый взляд, не соответствие стандарту.

ВК>>В "Microsoft Visual Studio 2008" артефакт подтверждается.

ВК>>С уважением,

ВК>>Владислав Курмаз.

ATP>А где у меня специализация шаблона?


В совете как раз и дана рекомендация не использовать специализации, а использовать
перегрузки. И самое главное почему так надо делать.

В приведённом Вами коде, как раз и есть применение данной рекомендации.
Поэтому я и сделал предположение о не соответсвии стандарту в данном конкретном случае
и проверил артефакт на "Microsoft Visual Studio 2008"
Re[4]: Перегрузка и специализация шаблона
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 02.11.09 16:56
Оценка:
Здравствуйте, Владислав Курмаз, Вы писали:

ВК>В совете как раз и дана рекомендация не использовать специализации, а использовать

ВК>перегрузки. И самое главное почему так надо делать.

ВК>В приведённом Вами коде, как раз и есть применение данной рекомендации.

ВК>Поэтому я и сделал предположение о не соответсвии стандарту в данном конкретном случае
ВК>и проверил артефакт на "Microsoft Visual Studio 2008"

Так я книгу читал, и там тоже помню эту рекомендацию, так вот и запутался поэтому.
Re[3]: Перегрузка и специализация шаблона
От: Кодт Россия  
Дата: 03.11.09 01:28
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

К>>Подстановка шаблона более приоритетна, чем статик-каст.

ATP>Этот порядок из вашего поста

Ну бывает, погнал.
Интересно, что где-то я сталкивался именно с неоднозначностью из-за равенства приоритетов. Может быть, это был баг VC6? Или там какие-то хитрые условия и тёмные углы языка втречались? Не помню.
Перекуём баги на фичи!
Re[4]: Перегрузка и специализация шаблона
От: Кодт Россия  
Дата: 03.11.09 01:36
Оценка:
К>Интересно, что где-то я сталкивался именно с неоднозначностью из-за равенства приоритетов. Может быть, это был баг VC6? Или там какие-то хитрые условия и тёмные углы языка втречались? Не помню.

Возможно, что попутал с процедурой неявного приведения типов.
Наподобие вот этого http://codepad.org/gZdS2zko
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.