РЕДАКТИРОВАТЬ: boost :: any, использующий bcp (спасибо AraK), кажется лучшим решением на сегодняшний день, но возможно ли доказать (до некоторой степени), что не существует ANSI C ++ решения этой проблемы?
Вы, кажется, немного смущены терминологией здесь.
Во-первых, давайте назовем это ISO C ++, не так ли? Он был стандартизирован ISO в 1998 году, и с тех пор именно на это ссылались люди, говоря о «стандарте C ++».
Теперь, что вы подразумеваете под «решением ANSI C ++»?
- Решение, которое аккуратно компилируется с использованием только ANSI (или ISO) C ++? Если это так, Boost является решением ANSI C ++
- Решение уже реализовано в стандартной библиотеке ANSI C ++? Если это так, то нет, такого решения не существует (и не существует «доказательства», кроме «прочитайте языковой стандарт и посмотрите, сможете ли вы найти такой класс. Если вы не можете, его там нет»).
- Решение, которое вы могли бы реализовать самостоятельно , используя только ANSI C ++. Тогда ответ «да, вы можете скопировать исходный код из Boost».
Я не могу представить, какое "доказательство" вы бы искали. C ++ - это документ в прозе. Это не математическое уравнение. Это не может быть «доказано», кроме как сказать «иди читать стандарт». Доказать, что что-то определено на языке или в стандартной библиотеке, легко - просто укажите, где в стандарте это описано. Но доказать, что что-то не является , в принципе невозможно - за исключением перечисления каждого отдельного предложения стандарта и документа, который ни один из них не описывает то, что вы ищете. И я сомневаюсь, что вы найдете кого-нибудь, кто готов сделать , что для вас.
В любом случае, правильное стандартное решение C ++ - для использования Boost.
Это не тяжелое решение. Boost довольно легок в том, что вы можете включить ровно необходимых вам бит без каких-либо зависимостей от остальной части коллекции библиотеки.
Из того, что вы описали (легкое приложение для широкой пользовательской базы), нет никаких причин не использовать Boost. Это может упростить ваш код и уменьшить количество ошибок, вызванных попытками изобретать велосипед. При распространении скомпилированного исполняемого файла он имеет нулевую стоимость. Библиотека Boost.Any
, как и большая часть Boost, предназначена только для заголовков и просто компилируется в ваш исполняемый файл. Отдельные библиотеки не должны распространяться.
Ничего нельзя получить, пытаясь заново изобрести колесо. Ваш исполняемый файл не будет меньше или эффективнее, но будет более ошибочным.
И я готов поспорить, что ваше решение домашнего приготовления не будет ANSI C ++. Он будет опираться на некоторую форму неопределенного поведения. Если вам нужно решение ANSI-C ++, лучше всего поднять Boost.