Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2016-11-14, 10:36
  #13
Medlem
kaks avatar
Citat:
Ursprungligen postat av enowen
Jo, det är nödvändigtvis int*, med andra ord är iterator<int> även känd som int*. Sedan bör man så klart hålla sig till en iterator och inte göra några implicit casts
Nej, det är inte nödvändigtvis int*. Det är en typ som uppfyller RandomAcccessIterator.
Dvs ++, --, += etc uppför som man förväntar sig. Dessutom skall operator* returnera en referens till elementet som iteratorn pekar på. int* uppfyller allt detta, men det finns fler möjliga implementationer. T.ex den som Visual C++ har i sina debug-byggen.
Om man antar int* bygger inte ens koden.
Citera
2016-11-14, 14:52
  #14
Medlem
enowens avatar
Citat:
Ursprungligen postat av kak
Nej, det är inte nödvändigtvis int*. Det är en typ som uppfyller RandomAcccessIterator.
Dvs ++, --, += etc uppför som man förväntar sig. Dessutom skall operator* returnera en referens till elementet som iteratorn pekar på. int* uppfyller allt detta, men det finns fler möjliga implementationer. T.ex den som Visual C++ har i sina debug-byggen.
Om man antar int* bygger inte ens koden.

Jag ska undersöka de där och återkommer när jag har kikat igenom lite kod.
Citera
2016-11-15, 14:01
  #15
Medlem
enowens avatar
Ok jag hade fel, enligt standarden (http://eel.is/c++draft/container.requirements#general) så är det inget krav på att det ska finnas någon operator type(). Jag trodde att det kanske va på nåt liknande sätt de löste det på:

Kod:
#include <iostream>

namespace fsx
{
    
template <typename Tsize_t SIZE>
    class array;

    
template <class Ttypename value_type typename std::remove_pointer<T>::type::value_type>
    class 
iterator
    
{
        private:
            
size_t m_index;
            
T m_container;

        public:
            
iterator(size_t indexT container) :
                
m_index{index},
                
m_container{container}
            {}

            
operator value_type*()
            {
                return &(*
this->m_container)[m_index];
            }

            
template <typename U>
            
operator U() = delete;
    };

    
template <typename Tsize_t SIZE>
    class array
    {
        private:
            
T m_array[SIZE];

        public:
            
using value_type T;

            array() = default;

            
Toperator[](const size_tindex)
            {
                return 
this->m_array[index];
            }

            
iterator<fsx::array<TSIZE>*> begin()
            {
                return 
fsx::iterator<decltype(this)>(0this);
            }

            
iterator<fsx::array<TSIZE>*> end()
            {
                return 
fsx::iterator<decltype(this)>(SIZE 1this);
            }
    };
}

int main()
{
    
fsx::array<int2arr;
    
arr[0] = 100;
    
arr[1] = 101;
    
intptr arr.begin();
    
std::cerr << *ptr << ", " << *(ptr+1) << std::endl;

__________________
Senast redigerad av enowen 2016-11-15 kl. 14:16.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback