Re[2]: Modern C++ Design ParameterType
От: rpz  
Дата: 07.10.12 20:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Есть класс свойств типа.


К>Это упражнение или велосипед? Если велосипед, то стоит посмотреть на boost::mpl, а если упражнение, то будем разбираться.

Это упражнение, конечно.


К>Дело в том, что тип T у функции выводится. Поскольку funcBy принимает "нечто типа T" по значению, то, что бы ей на вход ни подсунули, первым делом произойдёт неявное приведение к rvalue. А если lvalue->rvalue невозможно из-за приватного конструктора копирования, то будет ошибка компиляции.

К>Поэтому в первой строке T=int, во второй и третьей T=A. Даже если подсунуть туда const A, — всё равно const lvalue -> rvalue потеряет константность.
Да.. с выводом что-то затупил. Только вот про rvalue.. Почему к rvalue то приводится?

template<typename T>
void fooo(T i){T& ri=i;std::cout<<&i<<"fooo(T)\n";}

Берется адрес переменной, создается ссылка на нее. Значит i — lvalue. Или я не так понял что-то?

К>Кстати сказать, у переменной a и ссылки на ней ra тип один и тот же — это A, а вовсе не A&.

Да, действительно

    std::cout<<(typeid(ii)==typeid(rii))<<std::endl;

выводит true. А почему так сделано?

К>Если же явно указывать параметр funcBy<int>, funcBy<A>, funcBy<A&>, funcBy<const A&> — то вывод будет ожидаемо разный.

Т.е. получается только таким образом можно использовать ParameterType? С явным указанием параметра?
    funcBy<A&>(client::A_TypeTraits<A&>::ParameterType(ra));

Какая-то ерунда так получается. Приходится 2 раза писать тип
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.