На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> перегрузка шаблонной функции
    Цитата Qraizer @
    Ты ж сам захотел ссылку возвращать.

    Константная ссылка меня тоже устраивает. А для маленьких типов, которые не рационально передавать по ссылке, эту ссылку, можно и отключить.

    Сейчас, с удивлением, всё же смог скомпилировать код, который прошел тесты. ТОли в тестах ошибка. Толи он всё же заработал.

    ExpandedWrap disabled
      #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;
      }


    Эм, признаю, шаманство, однако вышло:
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0209 ]   [ 16 queries used ]   [ Generated: 9.12.22, 23:27 GMT ]