impressive17
@impressive17

Как вернуть разные типы из std::function?

Добрый день!
У меня есть std::function проинициализированная лямбдой
Лямбда возвращает тип X или Y в зависимости от выбранного ветвления
Я знаю что нужно возвращать один тип из функции, но суть в том, что для Y есть конструктор копирования от X и можно написать так X var1 = Y();
Собственно вопрос:
Как вернуть из лямбды разные типы?
std::function func{
            [](int z) {
                if (z>0) {
                    return X();
                }

                return Y();
            }
        };

Y var1 = X(); // тут все впорядке, так как есть соответствующий конструктор
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Как вернуть разные типы из std::function?

variant, any, void*

Но в вашем примере просто надо явно указать тип лямбды и/или приводить все возвращаемые значения к одному типу, раз уж предполагается что одно всё равно копируется в другое.

Можно подумать о возвращении указателя на динамически созданные объекты ковариантных типов. Но я не уверен, насколько вам это подойдёт архитектурно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xorknown
@xorknown
Будут проблемы - решайте
Идея так делать невероятно плохая, но если хочется можно использовать std::variant(или std::any) из C++17

std::function func{[](int z) -> std::variant<X, Y> {
                if (z>0) {
                    return X();
                }

                return Y();
            }
        };

    std::variant<X, Y> v = func(1);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы