спасибо всем, я нашел это сам:
мы можем сделать это одним из этих трех способов:
1- Строка запроса (eng: siteurl.com/form-url/ ? your_parameter = value)
2- шорткод (например: [gravityforms id = 1 field_values = 'your_parameter = value'])
3- крючки
конечно, мы должны определить имя_параметра для этого поля, которое нам нужно заполнить динамически
для получения дополнительной информации, перейдите по этой ссылке:
https://docs.gravityforms.com / с использованием динамическим населения /
Можно найти следующую статью интересной, поскольку она решает точно проблему, Вы отправили: На Силе Между Объектно-ориентированным и Универсальным Программированием в C++ и Какое Стирание Типа Может Делать с этим
Я сделал следующее прежде так, чтобы я получил итератор, который был независим от контейнера. Это, возможно, было излишеством, так как я, возможно, также использовал 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;
}
}
Это должно сделать то, что Вы хотите:
typedef typename std::vector<T>::iterator MyIterator;
От Ускоренный C++ :
Каждый раз, когда у Вас есть тип, такой как
vector<T>
, который зависит от шаблонного параметра, и Вы хотите использовать члена того типа, такой какsize_type
, который является самостоятельно типом, необходимо предшествовать всему имениtypename
для уведомления реализации для обработки имени как типа.
Я не уверен в том, что Вы подразумеваете "под не представлением станд.:: векторизуйте публично", но действительно, можно просто определить определение типа как этот:
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
, как предложено в комментариях