Здравствуй, all.
Один знакомый камрад попросил пройти аттестацию, которую он подготовил для сотрудников компании.
Здесь я приведу 2 из 15 вопросов, которые, с моей точки зрения стоит обсудить.
1. Чему будет равно значение А<9>::vаluе + А<2,2>::vаluе если структура А определена следующим образом:
tеmplаtе<unsignеd N, unsignеd I=0>
struсt А : А<N/2,I+1>{};
tеmрlаtе<unsignеd I>
struсt А<0,I>
{
stаtiс соnst unsignеd vаluе = I ;
};
2. Что будет выведено в результате выполнения данной программы :
template<class T, class U>
struct A{
struct dummy{char _[2];};
static char _(T);
static dummy _(...);
static const bool value=sizeof(_(U()) )==sizeof(char);
};
struct B{};
struct C:B{};
...
cout << A<B,C>::value << A<B,B>::value << A<C,B>::value;
Вопросов у меня несколько:
1. Кто как относится к применению тестов для аттестации сотрудников?
2. Насколько уместны вопросы по метапрограммированию если ответ на предыдущий вопрос положительный?
3. Что за хрень в последнем вопросе? Я даже увидев результат не смог раскусить ответ. Судя по результату оператор sizeof получает размер типа возвращаемого значения, которое возвращается функцией "_", при этом в зависимости от параметров шаблона выбирается разная функция: в некоторых случаях static char _(T);, а в некоторых: static dummy _(...); (очевидно, последняя выбирается в том случае, когда нет неявного преобразования между типами U и T).