Дано:Определение, большой SizeOf() в варианте повышающего
boost::variant<T1,T2,T3,...,TN>
Рассчитайте следующие во время компиляции:
max(sizeof(T1), sizeof(T2), sizeof(T3),... ,sizeof(TN))
Я не имел ни малейшего представления о том, как подойти к этому, но this ответ пролить некоторый свет на как я могу начать. Использование кода в том, что ответ с двумя типами, T1
и T2
, я мог бы использовать следующие в исходном файле, чтобы получить размер крупного объекта:
size_t largestSize = sizeof(largest<T1, T2>::type);
Это именно то, что я хотел бы сделать, но мне нужен шаблон largest
для работы с более чем двумя классами - в частности, ему нужно будет проверить все типы, хранящиеся в объекте boost::variant
.
Я знаю, что boost::variant
имеет types
typedef, который определяет какой-то список типов в варианте. Проблема в том, что я полностью теряюсь, когда пытаюсь обернуть голову вокруг всех вещей в реализации. Я не интуитивно понимаю, что boost::variant::types
is, и как я могу передать его в свой собственный шаблон, который что-то с ним делает.
В моей голове, это то, что окончательная реализация может выглядеть следующим образом:
typedef boost::variant<T1, T2, T3, T4> MyVariant;
size_t largestSize = sizeof(largest<MyVariant::types>::type);
К сожалению, я не имею ни малейшего представления о том, как идти о реализации этой версии largest
.
Я не уверен, что это разумный подход, поэтому я открыт для любых других способов достижения этого (возможно, примените boost::static_visitor
ко всем типам во время компиляции?).
Я пошел с этим решением, но во время моего тестирования я заметил, что это не будет скомпилирован с GCC 4.8.2 или 3.5.0 лязгом и старше , в то время как ответ Войцеха ниже компилируется с GCC 4.7.3 и clang 3.0. Я также заметил, что ни одно решение не компилируется с MSVC19. Ничего из этого не имеет значения в контексте вопроса, но может быть полезно, если кто-то споткнется об этом ответе. –