Функция с другим типом возврата, основанная на строковом представлении типа в качестве аргумента - PullRequest
0 голосов
/ 13 января 2020

Мне нужно создать функцию в C ++, которая возвращает результат с другим типом на основе получаемого строкового аргумента, который представляет этот тип (на текущей машине, на которой выполняется код). Например, такой вызов:

f("int", ...)

должен возвращать значение типа int, тогда как следующий вызов:

f("float", ...)

должен возвращать значение типа float .

Я бы хотел избежать любых видов исчерпывающих переключателей и т. Д. c, потому что моя цель - автоматизировать этот процесс: без предварительного знания, если f дана строка, соответствующая существующему тип, он вернет значение этого типа. Меня интересуют только примитивные типы C ++.

Я начинаю верить, что это даже невозможно. Я что-то упускаю?

1 Ответ

1 голос
/ 13 января 2020

Мне нужно создать функцию в C ++, которая возвращает результат с другим типом на основе строкового аргумента, который он получает

Вы не можете. Функция всегда возвращает объект одного типа (или ссылку или void), который не может зависеть от аргументов. Если вы попытаетесь написать вызов такой функции и использовать возвращаемое значение, вы поймете, почему это принципиально не работает на языке со статической типизацией:

const char* type = get_some_type();
??? variable = f(type);

Какой тип будет использовать вместо ???? Вы не можете использовать float, потому что тип ввода и, следовательно, возвращаемый тип может быть "int" на этом гипотетическом языке. Вы также не можете использовать int, потому что тип возвращаемого значения может float. auto также не может помочь, потому что выводит тип из инициализатора. Невозможно вывести тип из чего-то неизвестного.

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


Что вы можете сделать, это вернуть теговое объединение, такое как std::variant потенциальных типов возврата. Но вам нужно писать каждый случай явно, если вы не хотите использовать метапрограммирование вне языка. Это явное повторение может стать ненужным в будущем, если в язык будут введены соответствующие функции отражения.

...