Должен ли этот код по стандарту компилится и работать так как я хочу?
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;
}
Здравствуйте, NightWind, Вы писали:
NW>Должен ли этот код по стандарту компилится и работать так как я хочу?
Конечно, в простонародье это называется перегрузка функций.
Извиняюсь, не сразу понял, что имелось в виду, это наз-ся Partial ordering of function templates 14.5.5.2.
Здравствуйте, 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>>
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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тем параметров передается еще больше
Здравствуйте, zaufi, Вы писали:
Z>без компиляции видно что приведенный код работать не буит -- ибо макруха SFINAE принимает 2 параметра а не 3! (это в первом, втором и последнем случае... в 3тем параметров передается еще больше
Вах, щяйтян! Согласен. Ну разверните эту макруху, чтобы по смыслу было правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>