yigal_s: (Default)
[personal profile] yigal_s
Написал некий тестовый код, куда вбил довольно много элементарных тонкостей С++. Не то чтоб это всё было возможно помнить, но с другой стороны, не помня это, довольно тяжело писать правильный (нетривиальный) темплейтный код. Впрочем, даже и помня, всё равно тяжело.

Задание простое - определить, какая именно специализация функции вызывается (значение типа Т), результаты печати функциями printf а также возможные ошибки компиляции, если они будут.


Класс SayMyName специально устроен так, чтобы его использование генерило ошибку компиляции, в которой бы указывалось значение типа Т. Разумеется, его использование за ошибку компиляции мы считать не будем. Вроде бы были у меня случаи компиляторов, когда подобный трюк давал плохую диагностику, в этом случае можно было просто декларировать, но не имплементировать функции funcByVal и funcByRef, получая уже сообщения линкера, из которых уже можно было попытаться найти значения типа T.

template< class T > class SayMyName
{
// const int say=0; - this is underfined! :-)
};

template < class T > void funcByVal(T) { SayMyName< T >::say; }
template < class T > void funcByRef(T&) { SayMyName< T >::say; }

void test()
{
int i;
const int ci=0;
int &ri=i;
const int &rci=ci;
// what else?
// just 1, literal
//and...
int f();
const int cf();

funcByVal(i);
funcByVal(ci);
funcByVal(ri);
funcByVal(rci);

funcByRef(i);
funcByRef(ci);
funcByRef(ri);
funcByRef(rci);
funcByRef(1);
funcByRef(f());
funcByRef(сf());

// some more fun - do you know arrays? really?
int ar[10];

printf("%d\n", int(&ar)-int(ar));
printf("%d\n", int(1+ar)-int(ar));
printf("%d\n", int(1+&ar)-int(&ar));

funcByVal(ar);
funcByVal(&ar);
funcByRef(ar);
funcByRef(&ar);

funcByVal("test");
funcByVal(&"test");
funcByRef("test");
funcByRef(&"test");
}

дополнительное задание: как будет работать предыдущий пример, если определить следующие две функции, какие из них когда будут вызываться и с каким значением типа?

template < class T > void funcByRef(T&) { SayMyName< T >::say; }
template < class T > void funcByRef(const T&) { SayMyName< T >::say; }

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting