Почему не делает этого средства выделения STL C++, выделяют?

Это общий случай, когда реквизиты компонента меняются, и поэтому повторный рендеринг компонента происходит с новыми реквизитами.

Но, как кажется, вы не берете value блока input из реквизита, только атрибуты блока input будут изменены в соответствии с новыми реквизитами, переданными в CenterFormInput

] Попробуйте передать value поля также в подпорках (может быть пустым или пустым по умолчанию)

const CenterFormInput = ({
  formElement: { inputType, value = null, elementName, help, label },
  helpTextSetter
}) => {
  return (
    <div>
      <p>{label}</p>
      <p>
        <input name={elementName} value={value} type="text" />
      </p>
    </div>
  );
};

и обновить значение события onChange поля ввода. Это сбросит значение поля input при повторном рендеринге или установит значение, переданное.

Или вы можете также сделать компонент Statefull и поддерживать значение в состоянии и сбросить его на componentWillRecieveProps или getDerivedStateFromProps в зависимости от используемой вами версии реакции.

Не стесняйтесь добавлять комментарии в случае более подробной информации.

12
задан Dirk Groeneveld 12 February 2009 в 01:25
поделиться

4 ответа

Необходимо будет обеспечить снова переплетать членский шаблон и другой материал, который перечислен в требованиях к распределителям в Стандарте C++. Например, Вам нужен шаблонный конструктор копии, который принимает не только allocator<T> но также и allocator<U>. Например, один код мог бы сделать, который станд.:: список, например, вероятно, сделает

template<typename Allocator>
void alloc1chunk(Allocator const& alloc) {
    typename Allocator::template rebind<
        wrapper<typename Allocator::value_type>
      >::other ot(alloc);
    // ...
}

Код перестанет работать, если там или существовать не корректные будут снова переплетать шаблон или там не будут существовать никакой соответствующий конструктор копии. Вы нигде не не станете полезными с предположением, каковы требования. Рано или поздно Вы будете иметь отношение к коду, который полагается на одну часть тех требований к распределителям, и код перестанет работать, потому что Ваше средство выделения нарушает их. Я рекомендую смотреть на них в некотором рабочем проекте Вашей копии Стандарта в 20.1.5.

7
ответ дан 2 December 2019 в 21:04
поделиться

В этом случае проблема состоит в том, что я не переопределял снова переплетать члена средства выделения. Эта версия работы (в VS2008):

template <typename T> class a : public std::allocator<T> {
public:
    T* allocate(size_t n, const void* hint = 0) const {
        cout << "yo!";
        return 0;
    }

    template <typename U> struct rebind
    {
        typedef a<U> other;
    };
};

int main() {
    vector<int, a<int>> v(1000, 42);
    return 0;
}

Я нашел это путем отладки через заголовки STL.

Работает ли это или не будет абсолютно зависеть от реализации STL, хотя, таким образом, я думаю, что в конечном счете, Klaim является правильным в этом, что это не должно быть сделано этот путь.

4
ответ дан 2 December 2019 в 21:04
поделиться

У меня есть два шаблона для создания специализированных средств выделения; первые работы автоволшебно, если это используется на пользовательском типе:

template<>
class std::allocator<MY_TYPE>
{
public:
    typedef size_t      size_type;
    typedef ptrdiff_t   difference_type;
    typedef MY_TYPE*    pointer;
    typedef const MY_TYPE*  const_pointer;
    typedef MY_TYPE&    reference;
    typedef const MY_TYPE&  const_reference;
    typedef MY_TYPE     value_type;

    template <class U>
    struct rebind
    {
        typedef std::allocator<U> other;
    };

    pointer allocate(size_type n, std::allocator<void>::const_pointer hint = 0)
    {
        return reinterpret_cast<pointer>(ALLOC_FUNC(n * sizeof(T)));
    }
    void construct(pointer p, const_reference val)
    {
        ::new(p) T(val);
    }
    void destroy(pointer p)
    {
        p->~T();
    }
    void deallocate(pointer p, size_type n)
    {
        FREE_FUNC(p);
    }
    size_type max_size() const throw()
    {
        // return ~size_type(0); -- Error, fixed according to Constantin's comment
        return std::numeric_limits<size_t>::max()/sizeof(MY_TYPE);
    }
};

Второе используется, когда мы хотим иметь наше собственное средство выделения для предварительно определенного типа со стандартным средством выделения, например, символ, wchar_t, станд.:: строка, и т.д.:

    namespace MY_NAMESPACE
    {

    template <class T> class allocator;

    // specialize for void:
    template <>
    class allocator<void>
    {
    public:
        typedef void*       pointer;
        typedef const void* const_pointer;
        // reference to void members are impossible.
        typedef void        value_type;

        template <class U>
        struct rebind
        {
            typedef allocator<U> other;
        };
    };

    template <class T>
    class allocator
    {
    public:
        typedef size_t      size_type;
        typedef ptrdiff_t   difference_type;
        typedef T*      pointer;
        typedef const T*    const_pointer;
        typedef T&      reference;
        typedef const T&    const_reference;
        typedef T       value_type;

        template <class U>
        struct rebind
        {
            typedef allocator<U> other;
        };

        allocator() throw()
        {
        }
        template <class U>
        allocator(const allocator<U>& u) throw()
        {
        }
        ~allocator() throw()
        {
        }

        pointer address(reference r) const
        {
            return &r;
        }
        const_pointer address(const_reference r) const
        {
            return &r;
        }
        size_type max_size() const throw()
        {
            // return ~size_type(0); -- Error, fixed according to Constantin's comment
            return std::numeric_limits<size_t>::max()/sizeof(T);
        }
        pointer allocate(size_type n, allocator<void>::const_pointer hint = 0)
        {
            return reinterpret_cast<pointer>(ALLOC_FUNC(n * sizeof(T)));
        }
        void deallocate(pointer p, size_type n)
        {
            FREE_FUNC(p);
        }

        void construct(pointer p, const_reference val)
        {
            ::new(p) T(val);
        }
        void destroy(pointer p)
        {
            p->~T();
        }
    };

template <class T1, class T2>
inline
bool operator==(const allocator<T1>& a1, const allocator<T2>& a2) throw()
{
    return true;
}

template <class T1, class T2>
inline
bool operator!=(const allocator<T1>& a1, const allocator<T2>& a2) throw()
{
    return false;
}

}

Первый шаблон выше, для Вашего собственного определенного типа, не требует дальнейшей обработки, но используется автоматически стандартными контейнерными классами. Второй шаблон требует дальнейшей работы при использовании на стандартном типе. Для станд.:: строка, например, нужно использовать следующую конструкцию при объявлении переменных того типа (это является самым простым с определением типа):

std::basic_string<char>, std::char_traits<char>, MY_NAMESPACE::allocator<char> >
2
ответ дан 2 December 2019 в 21:04
поделиться

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

#include <iostream>
#include <vector>
using namespace std;

template <typename T> class a : public std::allocator<T> {
public:
    T* allocate(size_t n, const void* hint = 0) const {
        cout << "yo!";
        return new T[10000];
    }
};

int main()
{
    vector<int, a<int> > v(1000, 42);
    return 0;
}

Править: Я просто проверил Стандарт C++ относительно средства выделения по умолчанию. Нет никакого запрета на наследование от него. На самом деле, насколько я знаю, нет такого запрета ни в какой части Стандарта.

1
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

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