Я тут не нашёл ни в STL, ни в Boost версии any позволяющей избегать аллокаций. Точнее в STL есть small value optimization, но на практике размеры буфера очень малы (на GCC это всего лишь 1 указатель, в MSVC 3 указателя), а возможности задать свой размер нет (например, допустим, мы знаем, что большинство объектов меньше 64 байт).
Так что я сделал свой Any: https://pastebin.com/JMS32LNi
Вроде всё хорошо работает, кроме некоторых конструкторов:
int x = 10;
Any<64> v0 = x; // Ошибка
Any<64> v1 = 10; // Работает
Any<128> v2 = v1; // Ошибка
Собственно, в обоих случаях проблема в том, что вызывается конструктор template<typename T> Any(T &&value) вместо template<typename T> Any(const T &value) для первого случая и template<std::size_t N> Any(const Any<N> &value) для второго.
Как можно исправить вызовы конструкторов?
P. S. Такая же проблема с оператором присваивания - всегда выбирается версия с аргументом T, а версии с Any игнорируются.