blockquote>ptr++
ptr
не указывает на элемент массива, поэтому после его увеличения он становится недействительным - даже если в этом адресе есть другой объект. Когда вы проходите через него косвенно, поведение программы не определено.Что вам действительно нужно для итерации членов класса, так это языковая функция, называемая «отражение». C ++ имеет очень ограниченную поддержку для отражения. Вы можете хранить ссылки на элементы в массиве и выполнять итерацию массива. Обратите внимание, что, поскольку у нас не может быть массивов ссылок, нам нужно обернуть их, а в случае
printf
явно преобразовать оболочку обратно:std::array members { std::ref(finstr.union1.testint1), std::ref(finstr.union2.testint2), }; auto ptr = std::begin(members); printf("val: %i addr: %p\n", ptr->get(), (void*)&ptr->get()); ptr++; printf("val: %i addr: %p\n", ptr->get(), (void*)&ptr->get());
P.S. Я позволил себе зафиксировать
printf
звонок.%x
неверно для указателя.
Нет, я боюсь нет. Единственные вещи, которые можно сделать с ограничениями:
where T : class
- T должен быть ссылочным типом where T : struct
- T, должен быть не допускающий NULL-значения тип where T : SomeClass
- T значения, должен быть SomeClass или произойти из него where T : ISomeInterface
- T, должен быть ISomeInterface или реализовать, он where T : new()
- T должен иметь общедоступного конструктора без параметров , Различные комбинации выполнимы, но не все. Ничто об атрибутах.
Что я знаю; Вы не можете сделать этого. Вы имеете хотя о добавлении 'Инициализировать' метода или чего-то подобного?
public void Initialize<T>(T obj)
{
object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
if(attributes == null || attributes.Length == 0)
throw new InvalidOperationException("The provided object is not serializable");
}
я не протестировал этот код, но я надеюсь, что Вы понимаете мою мысль.
Боящийся нет. Лучше всего можно сделать, проверка на этапе выполнения на Тип. IsSerializable.
Если Вы ищете какой-либо класс, который является сериализуемым, я думаю, что Вам не повезло. При поиске объектов, которые Вы создали, Вы могли создать базовый класс, который является сериализуемым, и имейте каждый класс, который Вы хотите поддерживать, происходят из него.