Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2013, 14:35   #1
Lasor
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 67
По умолчанию Создание переменной по имени типа

Доброго времени суток.
Столкнулся с любопытной задачкой, которая возникала у многих, я почти уверен: создать переменную, зная её тип в виде строковой переменной (в моём случае QString).
Казалось бы, можно перегрузить функцию по возвращаемому значению, но этого делать не советуют, да и по рукам бить будут .
Есть у кого идеи как реализовать? Помнится, был один метод, из серии:
Код:
void generateByName(QString name)
{
    if (name == "") return new int;
    ...
}
Но именно так не работает, это понятно.
Lasor вне форума Ответить с цитированием
Старый 26.04.2013, 14:36   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Код:
void* generateByName(QString name)
{
    if (name == "") return (void *)new int;
    ...
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 26.04.2013, 14:47   #3
Lasor
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Код:
void* generateByName(QString name)
{
    if (name == "") return (void *)new int;
    ...
}
Оу...
Большое спасибо.
Lasor вне форума Ответить с цитированием
Старый 26.04.2013, 17:53   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
boost::any generateByName(QString name)
{
    if (name == "int") return int();
    ...
}
_Bers вне форума Ответить с цитированием
Старый 26.04.2013, 18:13   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Как бы boost не совсем стандартная библиотека. (хотя с ним решение будет красивее)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 26.04.2013, 18:50   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Как бы boost не совсем стандартная библиотека. (хотя с ним решение будет красивее)
Стандартного решения такой задачи вроде бы(!) не существует.
Но я бы поостерёгся так сразу называть boost::any красивым решением.

Может быть сегодня ситуация изменилась. Но когда я сам однажды заглянул под капот, то увидел следующую ужасающую картинку:

1. Ограниченный (например, не умеет работать с массивами)
2. Не эффективен (постоянно использует тормознутую new для хранения своего объекта).

То есть, он даже никак не оптимизирован для хранения маленьких объектов.

Внутри, эни создает объект через new, и сохраняет его как void*
То есть, он стабильно тратит sizeof(void*) на это дело.

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

То есть, в большинстве случаев, эни выступает в качестве аргумента функций. А аргументы функций как правило - либо всякие инты, либо всякие ссылки/указатели.

Получается, что в большинстве случаев, размер сохраняемого объекта опять таки укладывается в sizeof(void*).

Это означает, что в большинстве случаев, вместо использования тормознутой:

Код:
void* addr = new T();
Можно было бы использовать сверх-быстрый new placement:

Код:
unsigned char[sizeof(void*)] data;
new(data) T();
Что привело бы к ускорению работы any в десятки и тысячи раз.

---------
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод имени переменной C++ Alendorff Помощь студентам 2 05.03.2013 06:37
Ошибка в имени типа Arnild C# (си шарп) 0 27.03.2012 09:01
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
Динамическое формирование имени переменной... Kvinto Общие вопросы Delphi 9 17.11.2009 17:56
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 20:47