параметр значения шаблона приведения - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть шаблонный класс, который имеет логический аргумент шаблона.Есть ли законный способ привести его к ссылке на тот же объект, но с инвертированным логическим значением?

В качестве иллюстративного примера ниже у меня есть класс 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 (или переинтерпретация) всегда должно делать то, что я ожидаю, верно?

1 Ответ

3 голосов
/ 14 ноября 2011

Приведенный ниже метод transpose () пытается транспонировать объект без выполнения копирования, просто возвращая ссылку на себя, но с инвертированным флагом транспонирования.невозможно.

Для любого значения transposed (которое является логическим), Transposable_matrix<true> и Transposable_matrix<false> - это два разных и несовместимых типа.Один не может быть приведен к другому с помощью static_cast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...