powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как "вывести" возвращаемый тип функции?
15 сообщений из 15, страница 1 из 1
Как "вывести" возвращаемый тип функции?
    #39646864
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть map, которая в качестве ключа хранит название переменной, а в значении- саму переменную и необходимость вызывать для нее деструктор:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct sData
        {
            std::experimental::any Any;
            bool NeedDelete;
        };

        std::map<std::string, sData> Map;



Хочется написать НЕ шаблонную функцию, которая возвращает значение по ключу (названию переменной):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
auto GetValue(cstring& Key) -> decltype(Map.at(Key).Any.type().name())
        {
            std::experimental::any Any = Map.at(Key).Any;
            if(Any.type() == typeid(std::string))
            {
                return std::experimental::any_cast<std::string>(Any);
            }
            else if(Any.type() == typeid(QObject*))
            {
                return std::experimental::any_cast<QObject*>(Any);
            }
        }



Как такое сделать?
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646907
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никак

/thread
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646912
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Ты же понимаешь, что C++ не поддерживает разные типы возвращаемого значения в одной не-шаблонной функции, только если они не разделены if constexpr'ом.
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646931
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Тип значения поля Any становится известным только при работе программы.
При компиляции типа никакого нет, поэтому даже с шаблонами ничего нельзя вывести тип возвращаемого значения.

У вас 2 варианта:
1) указывать тип аргументом шаблона
2) возвращать any
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646936
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Ты советуешь ему микроскоп, а он еще молоток не освоил
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646937
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнение typeid, флаг необходимости вызова деструктора.

Все это дичайший говнокод с непониманием базовых принципов языка.
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646940
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл написать, что map у меня заполняется во время конструирования и имеет спецификатор const. Количество типов данных ограничено.
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646988
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Вообще, сама идея гетерогенных контейнеров в C++ не такая уж и новая. Тынц , например.
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646990
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyAlekseySQL,

Тип значения поля Any становится известным только при работе программы.
При компиляции типа никакого нет, поэтому даже с шаблонами ничего нельзя вывести тип возвращаемого значения.

У вас 2 варианта:
1) указывать тип аргументом шаблона
2) возвращать any

У меня было сделано по первому варианту, но оказалось, что при вызове деструктора объекта, который содержит вышеприведенные поле map + метод получения значения, деструкторы вложенных объектов не вызываются:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MyLib::VariativeData::~VariativeData()
{
    using PAIR = struct std::pair<string, sData>;

    for(PAIR& pair: Map)
    {
        if(pair.second.NeedDelete)
        {
            pair.second.Any.~any(); // НЕ ВЫЗЫВАЕТ ДЕСТРУКТОР ВЛОЖЕННОГО ОБЪЕКТА!!!
        }
    }
}



Поэтому появилась необходимость получать сами объекты и вызывать у них деструкторы. Это можно сделать сохранив в структуре дополнительное поле, характеризующее тип (и тупо перебирать с помощью if ... else if ...). Но так как уже есть функция получения значения из Any, то захотелось ее переделать, чтобы использовать в деструкторе. Похоже не получится...
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39646991
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLПоэтому появилась необходимость получать сами объекты и вызывать у них деструкторы. Это можно сделать сохранив в структуре дополнительное поле, характеризующее тип (и тупо перебирать с помощью if ... else if ...). Но так как уже есть функция получения значения из Any, то захотелось ее переделать, чтобы использовать в деструкторе. Похоже не получится...

Че- то я пока не проснулся: сам вчера написал кусок определения типа без всяких дополнительных полей в структуре (который потом решил внедрить в метод получения значения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
if(Any.type() == typeid(std::string))
            {
                return std::experimental::any_cast<std::string>(Any);
            }
            else if(Any.type() == typeid(QObject*))
            {
                return std::experimental::any_cast<QObject*>(Any);
            }
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39647349
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ещё написать Шаблонную функцию, которая возвращает параметр через входящую ссылку на возвращаемый параметр. Тогда вызывать её можно как Не шаблонную функцию.

Код: plaintext
1.
2.
3.
4.
5.
6.
template <typename> F(const cstring& Key, T& value)
// и:
int iValue = 0;
float fValue = 0.f;
F("int", iValue);
F("float", fValue);
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39647400
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Хм, практически так. Чуть поправил.
Код: plaintext
1.
2.
3.
4.
5.
template <class T> T F(const std::string& Key, T& value)
{
    //.... compute;  value = result
    return value;
}
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39647403
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вызов
Код: plaintext
1.
res = F("varname", &res);
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39647471
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, что мешает перегрузить для sData операторы приведения типа?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct sData
{
  std::experimental::any Any;
  bool NeedDelete;

  operator std::string ()
  {
    return std::experimental::any_cast<std::string>(Any);
  }

  operator QObject* ()
  {
    return std::experimental::any_cast<QObject*>(Any);
  }
};
...
Рейтинг: 0 / 0
Как "вывести" возвращаемый тип функции?
    #39647513
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Хитро! :)
Можно писать в одну строчку выражение. Ещё бы от второго параметра избавиться... может как-нибудь поиграться с оператором "=" или конструктором? Там же
Код: plaintext
1.
Type res = F("varname", &res);


Это в общем случае:
Код: plaintext
1.
Type res (F("varname", &res));


Как бы тут исхитриться и в конструкторе передать тип? Всех "проблем" это не решит, но жизнь упростит.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как "вывести" возвращаемый тип функции?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]