У меня есть шаблонный класс, который имеет логический аргумент шаблона.Есть ли законный способ привести его к ссылке на тот же объект, но с инвертированным логическим значением?
В качестве иллюстративного примера ниже у меня есть класс Matrix, транспонирование которого может быть представлено теми же данными объекта, нос "транспонированным" параметром шаблона, обратным.
template <bool transposed>
class Transposable_matrix
{
...
Transposable_matrix<!transposed>& transpose()
{
static_cast<Transposable_matrix<!transposed>& >(*this);
}
};
Приведенный выше метод transpose () пытается транспонировать объект без выполнения копирования, просто возвращая ссылку на себя, но с инвертированным флагом транспонирования.Однако, что неудивительно, операция приведения не выполняется во время компиляции.Есть ли приемлемый способ сделать это?Я предполагаю, что reinterpret_cast не дает никаких гарантий правильности.Я мог бы использовать прокси-объект для представления транспонированного объекта, но это потребовало бы рефакторинга всего класса.
Редактировать
После использования переинтерпретации приведения все мои модульные тестыпрохождение.Но переосмысление актеров заставляет меня нервничать - подпадает ли это под категорию «неопределенного поведения», и мне просто повезло?Или, поскольку два типа (Matrix<true>
и Matrix<false>
) имеют идентичные члены, должен ли я быть в безопасности?
Edit 2 Поможет ли заметить, что в этом классе нет виртуальных методов?Поэтому кажется, что побитовая копия элементов данных должна быть действительной, независимо от транспонированного состояния, поэтому приведение в стиле c (или переинтерпретация) всегда должно делать то, что я ожидаю, верно?