Вы должны изменить тип вашего array
элемент к чему-то, что может хранить целые и указатели (или предпочтительно std::vector<std::uint64_t>
). Подход типа безопасен в использовании boost::variant
:
std::vector<boost::variant<std::uint64_t, std::vector<std::uint64_t>>> array;
array.push_back(1);
array.push_back(2);
array.push_back(std::vector<std::uint64_t>{4,5,6});
if (int* x = boost::get<std::uint64_t>(array[0])) { ... }
if (std::vector<std::uint64_t>* x
= boost::get<std::vector<std::uint64_t>>(array[2])) { ... }
Если вы хотите использовать встроенные массивы вместо векторов можно использовать союзы вместо boost::variant
:
struct IntOrArray
{
bool isInt;
union {
std::uint64_t int_value;
std::uint64_t* array_value;
}
};
std::vector<IntOrArray> array;
IntOrArray a1;
IntOrArray a1.isInt = true;
IntOrArray a1.int_value = 1;
array.push_back(a1);
IntOrArray a2;
IntOrArray a2.isInt = false;
IntOrArray a2.array_value = arrayYouGotElsewhere;
array.push_back(a2);
if (array[0].isInt) { ... }
C++ 11 позволяет поместите std::vector
в союзы, но это не поддерживается всеми компиляторами.
Это очень уродливая практика (в C++ не в C) для интерпретации указателей как чисел (и наоборот). Это вообще, но, согласно вашему примеру, это уродливое^2, потому что - как бы вы переосмыслили их назад к указателям? Возможно, лучший способ - пересмотреть архитектуру. – borisbn