Псевдочастичная специализация функций
От: NightWind Россия  
Дата: 14.07.06 12:43
Оценка:
Должен ли этот код по стандарту компилится и работать так как я хочу?

template< class TIn, class TOut >
void Convert(TIn In, TOut Out){}

template< class T >
void Convert(T In, T Out){}

int main()
{
int a = 0;
float b = 0, c = 0;

Convert( a, b ); //Вызов 1
Convert( b, c ); //Вызов 2

return 0;
}
Re: Псевдочастичная специализация функций
От: shank  
Дата: 14.07.06 12:48
Оценка:
Здравствуйте, NightWind, Вы писали:

NW>Должен ли этот код по стандарту компилится и работать так как я хочу?


Конечно, в простонародье это называется перегрузка функций.
Re: Псевдочастичная специализация функций
От: Dmitry Kotlyarov Россия  
Дата: 14.07.06 12:51
Оценка:
Здравствуйте, NightWind, Вы писали:

NW>Должен ли этот код по стандарту компилится и работать так как я хочу?


Это не специализация, а перегрузка.
Re[2]: Псевдочастичная специализация функций
От: shank  
Дата: 14.07.06 12:51
Оценка: 2 (1)
Извиняюсь, не сразу понял, что имелось в виду, это наз-ся Partial ordering of function templates 14.5.5.2.
Re: Псевдочастичная специализация функций
От: Кодт Россия  
Дата: 14.07.06 13:03
Оценка:
Здравствуйте, NightWind, Вы писали:

NW>Должен ли этот код по стандарту компилится и работать так как я хочу?


Проверил с помощью Комо-онлайн.
struct X {};
struct Y {};

// возвращаю взаимно-неприводимые типы, чтобы убедиться, что компилятор пошёл по правильному пути
template<class A, class B> X foo(A,B) { return X(); }
template<class A> Y foo(A,A) { return Y(); }

int main()
{
  X x = foo(123, 123.0);
  Y y = foo(123, 123);
}


Кстати говоря, можно с помощь SFINAE сделать более изощрённо. Скажем, различать механизмы конверсии.
#define SFINAE(result, predicate) typename enable_if< predicate , result >::type

// однотипные аргументы
template<class From, class To>
SFINAE(void, is_same<From,To>)
convert(const From&, To&) { ..... }
    
// срезка: запись из потомка в базу
template<class From, class To>
SFINAE(void, is_base_and_derived<To,From>)
convert(const From&, To&) { ..... }

// существует приведение типов, но это не срезка
template<class From, class To>
SFINAE(void, and_< is_convertible<From,To>, not_< or_< is_same<To,From>, is_base_and_derived<To,From> > > >)
convert(const From&, To&) { ..... }

// приведения типов не существует
template<class From, class To>
SFINAE(void, not_< is_convertible<From,To> >)
convert(const From&, To&) { ..... }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[2]: Псевдочастичная специализация функций
От: zaufi Земля  
Дата: 14.07.06 13:18
Оценка: +1
Здравствуйте, Кодт, Вы писали:

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


NW>>Должен ли этот код по стандарту компилится и работать так как я хочу?


К>Проверил с помощью Комо-онлайн.

К>
К>struct X {};
К>struct Y {};

К>// возвращаю взаимно-неприводимые типы, чтобы убедиться, что компилятор пошёл по правильному пути
К>template<class A, class B> X foo(A,B) { return X(); }
К>template<class A> Y foo(A,A) { return Y(); }

К>int main()
К>{
К>  X x = foo(123, 123.0);
К>  Y y = foo(123, 123);
К>}
К>


К>Кстати говоря, можно с помощь SFINAE сделать более изощрённо. Скажем, различать механизмы конверсии.

К>
К>#define SFINAE(result, predicate) typename enable_if< predicate , result >::type

К>// однотипные аргументы
К>template<class From, class To>
К>SFINAE(void, is_same<From,To>)
К>convert(const From&, To&) { ..... }
    
К>// срезка: запись из потомка в базу
К>template<class From, class To>
К>SFINAE(void, is_base_and_derived<To,From>)
К>convert(const From&, To&) { ..... }

К>// существует приведение типов, но это не срезка
К>template<class From, class To>
К>SFINAE(void, and_< is_convertible<From,To>, not_< or_< is_same<To,From>, is_base_and_derived<To,From> > > >)
К>convert(const From&, To&) { ..... }

К>// приведения типов не существует
К>template<class From, class To>
К>SFINAE(void, not_< is_convertible<From,To> >)
К>convert(const From&, To&) { ..... }
К>


без компиляции видно что приведенный код работать не буит -- ибо макруха SFINAE принимает 2 параметра а не 3! (это в первом, втором и последнем случае... в 3тем параметров передается еще больше
Re[3]: Псевдочастичная специализация функций
От: Кодт Россия  
Дата: 14.07.06 13:22
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>без компиляции видно что приведенный код работать не буит -- ибо макруха SFINAE принимает 2 параметра а не 3! (это в первом, втором и последнем случае... в 3тем параметров передается еще больше


Вах, щяйтян! Согласен. Ну разверните эту макруху, чтобы по смыслу было правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.