как повышение:: функция и повышение:: свяжите работу

Вы можете попробовать код ниже:

serviceItemForm: FormGroup;
apiForm : FormGroup;

this.apiForm = this.fb.group({
    'apiurl': new FormControl(''),
    'apimethod': new FormControl(''),
    'headers': this.fb.array([]),
    'payload': '',
  });

this.serviceItemForm = this.fb.group({
  'name': new FormControl('', Validators.required),
  'description': new FormControl('', Validators.required),
  'categoryIds': new FormControl([], Validators.required),
  'tags': [],
  'status': '',
  'orderFormType': new FormControl([], Validators.required),
  'orderFormKey': new FormControl([], Validators.required),
  'workflow': [],
  'orderFormAction': new FormControl('', Validators.required),
  'customUI': new FormControl(''),
  'api': this.apiForm,
  'userGroup': []
});

82
задан manlio 7 March 2014 в 13:14
поделиться

1 ответ

boost::function позволяет чему-либо с operator() с правильной подписью быть связанным как параметр, и результат Вашего связываем можно назвать с параметром int, таким образом, это может быть связано с function<void(int)>.

Это - то, как это работает (это описание применяется одинаково для std::function):

boost::bind(&klass::member, instance, 0, _1) возвраты объект как это

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return instance->*&klass::member(0, i);
}

, где return_type и int выведены из подписи [1 112], и указатель функции и связанный параметр, на самом деле хранится в объекте, но это не важно

Теперь, boost::function не делает никакой проверки типа: Это возьмет любой объект и любую подпись, которую Вы обеспечиваете в ее шаблонном параметре и создаете объект, это является вызываемым согласно Вашей подписи и называет объект. Если это невозможно, это - ошибка компиляции.

boost::function на самом деле объект как это:

template <class Sig>
class function
{
  function_impl<Sig>* f;
public:
  return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};

то, где return_type и argument_type извлечены от [1 117], и f, динамично выделяется на "куче". Это необходимо для разрешения абсолютно несвязанных объектов с различными размерами, связывают с [1 119].

function_impl просто абстрактный класс

template <class Sig>
class function_impl
{
public:
  virtual return_type operator()(argument_type arg0) const=0;
};

класс, который делает всю работу, реальный класс, полученный от [1 121]. Существует один для каждого типа объекта, который Вы присваиваете [1 122]

template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
  Object o
public:
  virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};

, Который означает в Вашем случае, присвоение повышать функцию:

  1. инстанцирует типа function_impl_concrete<void(int), unspecified_type> (это - время компиляции, конечно)
  2. создает новый объект того типа на "куче"
  3. , присваивает этот объект f участнику повышения:: функция

при вызове функционального объекта он вызывает виртуальную функцию своего объекта реализации, который направит вызов к исходной функции.

ПРАВОВАЯ ОГОВОРКА: Обратите внимание, что имена в этом объяснении сознательно составлены. Любое подобие живым людям или символам... Вы знаете это. Цель состояла в том, чтобы проиллюстрировать принципы.

95
ответ дан jpalecek 24 November 2019 в 09:20
поделиться
Другие вопросы по тегам:

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