Как я могу представить итераторы, не представляя используемый контейнер?

спасибо всем, я нашел это сам:

мы можем сделать это одним из этих трех способов:
1- Строка запроса (eng: siteurl.com/form-url/ ? your_parameter = value)
2- шорткод (например: [gravityforms id = 1 field_values ​​= 'your_parameter = value'])
3- крючки

конечно, мы должны определить имя_параметра для этого поля, которое нам нужно заполнить динамически

для получения дополнительной информации, перейдите по этой ссылке:
https://docs.gravityforms.com / с использованием динамическим населения /

24
задан Statement 1 October 2008 в 10:02
поделиться

4 ответа

Можно найти следующую статью интересной, поскольку она решает точно проблему, Вы отправили: На Силе Между Объектно-ориентированным и Универсальным Программированием в C++ и Какое Стирание Типа Может Делать с этим

19
ответ дан 29 November 2019 в 00:17
поделиться

Я сделал следующее прежде так, чтобы я получил итератор, который был независим от контейнера. Это, возможно, было излишеством, так как я, возможно, также использовал API, куда вызывающая сторона передает в vector<T*>&, который должен быть заполнен со всеми элементами, и затем вызывающая сторона может просто выполнить итерации от вектора непосредственно.

template <class T>
class IterImpl
{
public:
    virtual T* next() = 0;
};

template <class T>
class Iter
{
public:
    Iter( IterImpl<T>* pImpl ):mpImpl(pImpl) {};
    Iter( Iter<T>& rIter ):mpImpl(pImpl) 
    {
        rIter.mpImpl = 0; // take ownership
    }
    ~Iter() {
        delete mpImpl; // does nothing if it is 0
    }
    T* next() {
    return mpImpl->next(); 
    }
private:
    IterImpl<T>* mpImpl; 
};

template <class C, class T>
class IterImplStl : public IterImpl<T>
{
public:
    IterImplStl( C& rC )
    :mrC( rC ),
    curr( rC.begin() )
    {}
    virtual T* next()
    {
    if ( curr == mrC.end() ) return 0;
    typename T* pResult = &*curr;
    ++curr;
    return pResult;
    }
private:
    C& mrC;
    typename C::iterator curr;
};


class Widget;

// in the base clase we do not need to include widget
class TestBase
{
public:
    virtual Iter<Widget> getIter() = 0;
};


#include <vector>

class Widget
{
public:
    int px;
    int py;
};

class Test : public TestBase
{
public:
    typedef std::vector<Widget> WidgetVec;

    virtual Iter<Widget> getIter() {
        return Iter<Widget>( new IterImplStl<WidgetVec, Widget>( mVec ) ); 
        }

    void add( int px, int py )
    {
        mVec.push_back( Widget() );
        mVec.back().px = px;
        mVec.back().py = py;
    }
private:
    WidgetVec mVec;
};


void testFn()
{
    Test t;
    t.add( 3, 4 );
    t.add( 2, 5 );

    TestBase* tB = &t;
    Iter<Widget> iter = tB->getIter();
    Widget* pW;
    while ( pW = iter.next() )
    {
        std::cout << "px: " << pW->px << " py: " << pW->py << std::endl;
    }
}
2
ответ дан 29 November 2019 в 00:17
поделиться

Это должно сделать то, что Вы хотите:

typedef typename std::vector<T>::iterator MyIterator;

От Ускоренный C++ :

Каждый раз, когда у Вас есть тип, такой как vector<T>, который зависит от шаблонного параметра, и Вы хотите использовать члена того типа, такой как size_type, который является самостоятельно типом, необходимо предшествовать всему имени typename для уведомления реализации для обработки имени как типа.

1
ответ дан 29 November 2019 в 00:17
поделиться

Я не уверен в том, что Вы подразумеваете "под не представлением станд.:: векторизуйте публично", но действительно, можно просто определить определение типа как этот:

typedef typename std::vector<T>::iterator iterator;
typedef typename std::vector<T>::const_iterator const_iterator; // To work with constant references

Вы будете в состоянии изменить эти определения типов позже без пользователя, замечающего что-либо...

Между прочим, это считают хорошей практикой, чтобы также представить несколько других типов, если Вы хотите, чтобы Ваш класс вел себя как контейнер:

typedef typename std::vector<T>::size_type size_type;
typedef typename std::vector<T>::difference_type difference_type;
typedef typename std::vector<T>::pointer pointer;
typedef typename std::vector<T>::reference reference;

И в случае необходимости Вашим классом:

 typedef typename std::vector<T>::const_pointer const_pointer;
 typedef typename std::vector<T>::const_reference const_reference;

Вы найдете значение всех ими определение типа здесь: документация STL относительно векторов

Редактирование: Добавленный typename, как предложено в комментариях

1
ответ дан 29 November 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: