как сделать экземпляр std :: function - PullRequest
4 голосов
/ 29 декабря 2011

В C ++ 0x мы используем std::function, как показано ниже:

int normal_function() {
    return 42;
}
std::function<int()> f = normal_function;

Итак, чтобы получить экземпляр std::function, мы должны сначала определить его тип. Но это скучно, а иногда и тяжело.

Итак, можем ли мы просто использовать make для получения std::function экземпляра, такого как std::tuple?

На самом деле, я просто погуглил, C ++ 0x не предоставляет такой возможности make.

Почему в C ++ 0x нет функции make? Можем ли мы реализовать это?

1 Ответ

16 голосов
/ 29 декабря 2011

Да, мы можем реализовать это

template<typename T>
std::function<T> make_function(T *t) {
  return { t };
}

Для этого необходимо передать функцию в make_function.Чтобы предотвратить перегрузку, чтобы поднять это для чего-то другого, кроме простой функции, вы можете SFINAE это

template<typename T>
std::function<
  typename std::enable_if<std::is_function<T>::value, T>::type
> make_function(T *t) {
  return { t };
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...