Создайте std::function с помощью конструктора на основе шаблона

Можно ли построить std::function с конструктором типа, определенного аргументом шаблона?

Например:

template <typename T>
bool registerType()
{
    const std::function<T()> func = &T::T; //I know this doesn't work
    //...
}

1 ответ

Решение

Я так не думаю, потому что конструкторы не имеют имен, вы не можете взять указатель / ссылку на них, и в целом они ведут себя не совсем как функции.

Вы можете использовать лямбду для инициализации std::function с той же подписью:

const std::function<T()> func = [](void) { return T(); } // or something like that

Вызов его приводит к тому же результату, что и выражение T() построить временный тип T, но возможно с разными побочными эффектами. В случае истинного вызова функции в операторе return есть дополнительный временный объект, который номинально копируется / перемещается в возвращаемое значение. Реализация может или не может исключить дополнительные временные.

Другие вопросы по тегам