SFINAE?
От: igna Россия  
Дата: 26.06.08 07:29
Оценка:

In attempting to use function template argument deduction to select among a number of overloaded function templates and nontemplate functions, the compiler may attempt a specialization that fails on one or more of them.

template <typename T> void f( T );
template <typename T> void f( T * );
//...
f( 1024 ); // instantiates first f

Even though substitution of the nonzero integer for T * in the second f function template would have been incorrect, the attempted substitution does not give rise to an error provided that a correct substitution is found. In this case, the first f is instantiated, and there is no error. Thus, we have the "substitution failure is not an error" concept, dubbed SFINAE by Vandevoorde and Josuttis.


Этот пример в самом деле демонстрирует SFINAE?
Re: SFINAE?
От: Bell Россия  
Дата: 26.06.08 07:32
Оценка:
Здравствуйте, igna, Вы писали:

I>

I>template <typename T> void f( T );
I>template <typename T> void f( T * );
I>//...
I>f( 1024 ); // instantiates first f


I>Этот пример в самом деле демонстрирует SFINAE?


Да, а в чем сомнение?
Любите книгу — источник знаний (с) М.Горький
Re[2]: SFINAE?
От: Bell Россия  
Дата: 26.06.08 07:43
Оценка:
Здравствуйте, Bell, Вы писали:

B>Да, а в чем сомнение?


Вот только фраза

Even though substitution of the nonzero integer

вселяет ложную надежду на то, что вызов f с нулем не приведет к ошибке подстановки
Любите книгу — источник знаний (с) М.Горький
Re[2]: SFINAE?
От: igna Россия  
Дата: 26.06.08 09:11
Оценка:
Здравствуйте, Bell, Вы писали:

B>Да, а в чем сомнение?


Спасибо. До сих пор встречались примеры SFINAE либо с явным инстанцированием, либо с неявным, но с невозможностью выполнить подстановку в типе возвращаемого значения, потому и вопрос.
Re[2]: SFINAE?
От: Кодт Россия  
Дата: 26.06.08 14:12
Оценка:
Здравствуйте, Bell, Вы писали:

I>>Этот пример в самом деле демонстрирует SFINAE?

B>Да, а в чем сомнение?

Собственно, именно на этом примере и показана штатная работа SFINAE — неотъемлемой части механизма выбора наиболее специализированного шаблона.
А всякие enable_if — это трюки, основанные на SFINAE.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: SFINAE?
От: igna Россия  
Дата: 26.06.08 15:24
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Собственно, именно на этом примере и показана штатная работа SFINAE — неотъемлемой части механизма выбора наиболее специализированного шаблона.


IMHO все же в первоисточнике S в SFINAE означает substitution в том смысле, в котором это слово упоминается в главе 14 Templates стандарта. А там речь вовсе не о "substitution of the nonzero integer for T *".
Re[4]: SFINAE?
От: Кодт Россия  
Дата: 26.06.08 17:23
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO все же в первоисточнике S в SFINAE означает substitution в том смысле, в котором это слово упоминается в главе 14 Templates стандарта. А там речь вовсе не о "substitution of the nonzero integer for T *".


Тип int не удалось подставить в образец T*, следовательно — пролетели. А не константу "ненулевое целое".
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[5]: SFINAE?
От: igna Россия  
Дата: 27.06.08 06:23
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тип int не удалось подставить в образец T*, следовательно — пролетели.


"Не удалось подставить" по мнению первоисточника не всегда SFINAE. Смотри, вот несколько длинноватая цитата из C++ Templates: The Complete Guide By David Vandevoorde, Nicolai M. Josuttis:

11.1 The Deduction Process
The deduction process compares the types of an argument of a function call with the corresponding parameterized type of a function template and attempts to conclude the correct substitution for one or more of the deduced parameters. Each argument-parameter pair is analyzed independently, and if the conclusions differ in the end, the deduction process fails. Consider the following example:


template<typename T> 
T const& max (T const& a, T const& b) 
{ 
    return a<b?b:a; 
} 

int g = max(1, 1.0);


Here the first call argument is of type int so the parameter T of our original max() template is tentatively deduced to be int. The second call argument is a double, however, and so T should be double for this argument: This conflicts with the previous conclusion. Note that we say that "the deduction process fails," not that "the program is invalid." After all, it is possible that the deduction process would succeed for another template named max (function templates can be overloaded much like ordinary functions; see Section 2.4 on page 15 and Chapter 12).

If all the deduced template parameters are consistently determined, the deduction process can still fail if substituting the arguments in the rest of the function declaration results in an invalid construct. For example:

template<typename T> 
typename T::ElementT at (T const& a, int i) 
{ 
    return a[i]; 
} 

void f (int* p) 
{ 
    int x = at(p, 7); 
}


Here T is concluded to be int* (there is only one parameter type where T appears, so there are obviously no analysis conflicts). However, substituting int* for T in the return type T::ElementT is clearly invalid C++, and the deduction process fails. [1] The error message is likely to say that no match was found for the call to at(). In contrast, if all the template arguments are mentioned explicitly, then there is no chance that the deduction process will succeed for another template, and the error message is more likely to say that the template arguments for at() are invalid. You can investigate this by comparing the diagnostic for the previous example with

[1] In this case, deduction failure leads to an error. However, this falls under the SFINAE principle (see Section 8.3.1 on page 106): If there were another function for which deduction succeeds, the code could be valid.


SFINAE упоминается лишь после второго примера, очевидно, что авторы считают, что в первом примере никакой SFINAE за уши притягивать не нужно.
Re[6]: SFINAE?
От: Кодт Россия  
Дата: 27.06.08 08:19
Оценка:
Здравствуйте, igna, Вы писали:

<>
I>SFINAE упоминается лишь после второго примера, очевидно, что авторы считают, что в первом примере никакой SFINAE за уши притягивать не нужно.

Однако, в первом примере тоже различают вывод параметров и явное их указание.
И та же ситуация: неудача вывода — не ошибка (s.f.i.n.a.e.), неудача сопоставления с явно указанным — ошибка.
А второй пример более тонкий и требует особых пояснений: неудача вывода зависимого типа в объявлении тоже не является ошибкой (а в определении — в теле функции — уже приведёт к ошибке).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[7]: SFINAE?
От: igna Россия  
Дата: 27.06.08 08:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Однако, в первом примере тоже различают вывод параметров и явное их указание.

К>И та же ситуация: неудача вывода — не ошибка (s.f.i.n.a.e.), неудача сопоставления с явно указанным — ошибка.

Все же S в SFINAE означает не "вывода", а "подстановки". Substituting является частью deduction process. В первом примере deduction process fails еще до выполнения substituting.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.