: конструктор типа в компайл тайме?
Нет. У конструктора невозможно взять адрес, чтобы положить эту ссылку в словарь.
вместо конструктора бери просто фабрику - тогда можно
Можно. Она должна быть мутабельна? Дефолтный конструктор? Храните тип. Из него можно сконструировать объект. Или конкретный из конструкторов? Храните тип и типы-аргументы конструктора, чтобы выбрать соответствующую перегрузку
Я вот смотрю на boost factory, это н6е она?
Ты можешь создать создающую функцию и уже её помещать в словарь
конструктор дефолтный без аргументов. Мне нужно, чтобы на основании переданной строки конструировался инстанс определенного класса
А инстанс куда класть? В полиморфный указатель на базу? В вариант?
В полиморфный указатель на базу.
Тогда не вижу проблемы.. unordered_map<string, function<unique_ptr<base>()>> и вперёд
Проблема в том, что мапу желательно заполнить в компайлтайме.
Что означает "нельзя"? Мы можем хранить словарь ключ-тип. И мы можем дефолтно-сконструировать объект соответствующего типа. Другое дело, что это, вероятно, не то, чего хочет @skarndev
словарь "КЛЮЧЬ-КОНСТРУКТОР" мы не можем хранить, у конструктора нет типа.
Да нет, вроде то.
Тут в слове "компайл-тайм" может быть очень много разных смыслов. Простейший вариант уже предложили, всё остальное - это оверинжиниринг для каких-то специфических ситуаций
Именно поэтому я написал, что вместо этого нам достаточно хранить тип (а не сам конструктор), благодаря которому мы можем вызвать интересующий нас конструктор
И каким это образом по типу ты собираешься конструктор звать?
Для CT поиска по строкам с идеальным хешем https://github.com/serge-sans-paille/frozen
T{}, поскольку из постановки задачи известно, что нас интересует именно дефолтный конструктор
что-то чудеса какие-то... Ты можешь код определения словаря написать, пример? Ну и вызов конструктора по нему, тоже.
Вместо траты времени на собственную реализацию, я сошлюсь на Boost. Благодаря NTTP с C++20 мы можем в качестве ключа оперировать в том числе и строками. Если интересует вопрос рантайм преобразования – автору вопроса потребуется написать дополнительную логику для хэширования, а из-за того, что это может быть сложнее, чем реально необходимо – я выше написал, что это, вероятно, не то, что нужно автору вопроса и порекомендовал бы взять вариант, предложенный @smertig
Так итого так можно делать ? А что значением в мапе будет ? typeid(тип) ?
Это будет особая мапа. Что то типа type_list<pair<compile_time_string("T1"), T1>, pair<compile_time_string("T2"), T2>, pair<compile_time_string("T3"), T3>, ...>
Вот и я не понимаю...
А T1, T2 ... - это что?
Типы, конструкторы которых мы хотим вызывать
Ну вот так... Попробуй , напиши.
Это можно оформить рекурсивным шаблоном? (и макросами?)
Обсуждают сегодня