Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.82.140.17] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Константная ссылка меня тоже устраивает. А для маленьких типов, которые не рационально передавать по ссылке, эту ссылку, можно и отключить. Сейчас, с удивлением, всё же смог скомпилировать код, который прошел тесты. ТОли в тестах ошибка. Толи он всё же заработал. #include <cassert> #include <type_traits> #include <memory> #include <iostream> // получение значения template< typename PtrType, typename ValueType> auto get_valueof( PtrType& ptr, ValueType& value ) -> typename std::enable_if_t< std::is_const_v< PtrType > or std::is_const_v< ValueType >, const ValueType& > { if(nullptr == ptr) return const_cast< const ValueType& >( value ); else return const_cast< const ValueType& >( *ptr ); } // получение значения template< typename PtrType, typename ValueType> auto get_valueof( PtrType& ptr, ValueType& value ) -> typename std::enable_if_t< ( not std::is_const_v< PtrType > ) and ( not std::is_const_v< ValueType > ), ValueType& > { if(nullptr == ptr) return value; else return *ptr; } // разыменование константного указателя и константного значения void test1() { const int def1 = 0; const int val1 = 1; const int*const ptr1 = &val1; const int*const zero1 = nullptr; assert( 1 == get_valueof( ptr1, def1 )); assert( 0 == get_valueof( zero1, def1 )); assert( ( std::is_same_v< const int&, decltype( get_valueof( ptr1, def1 ) ) > ) ); } // разыменование константного указателя и неконстантного значения void test2() { int def1 = 0; const int val1 = 1; const int*const ptr1 = &val1; const int*const zero1 = nullptr; assert( 1 == get_valueof( ptr1, def1 )); assert( 0 == get_valueof( zero1, def1 )); assert( ( std::is_same_v< const int&, decltype( get_valueof( ptr1, def1 ) ) > ) ); } // разыменование указателя и константного значения void test3() { const int def1 = 0; int val1 = 1; int* ptr1 = &val1; int* zero1 = nullptr; assert( 1 == get_valueof( ptr1, def1 )); assert( 0 == get_valueof( zero1, def1 )); assert( ( std::is_same_v< const int&, decltype( get_valueof( ptr1, def1 ) ) > ) ); } // разыменование указателя и значения void test4() { int def1 = 0; int val1 = 1; int* ptr1 = &val1; int* zero1 = nullptr; assert( 1 == get_valueof( ptr1, def1 )); assert( 0 == get_valueof( zero1, def1 )); assert( ( std::is_same_v< int&, decltype( get_valueof( ptr1, def1 ) ) > ) ); } // главная функция int main() { std::cout << "get_pointerof" << std::endl; test1(); test2(); test3(); test4(); return 0; } Эм, признаю, шаманство, однако вышло: |