C ++ преобразование const передача по ссылке - PullRequest
0 голосов
/ 30 сентября 2011

Возможно использование шаблона преобразования по ссылке / оператора приведения типа (без констант):

class TestA
{
    public:

        //Needs to be a const return
        template<typename TemplateItem>
        operator TemplateItem&() const {TemplateItem A; A = 10; return A;}
};

int main()
{
    TestA A;
    {
        int N;
        N = A;
        printf("%d!\n",N);
    }
    {
        float N;
        N = A;
        printf("%f!\n",N);
    }
    return 0;
}

И с учетом следующего кода (с константой):

class TestA
{
    public:

        //Produces error
        template<typename TemplateItem>
        operator const TemplateItem&() const {TemplateItem A; A = 10; return A;}
};

Выдает эти ошибки:

ошибка: невозможно преобразовать 'TestA' в 'int' в присваивании
ошибка: невозможно преобразовать 'TestA' в 'float' в присваивании

Вопрос

Как мне сделать так, чтобы оператор преобразования / приведение типа возвращал константную ссылку на тип шаблона?

Context

Прежде чем большинство людей придет и задумается о том, что «вы не можете преобразовать это просто во что-то», вам нужен контекст. Приведенный выше код является псевдокодом - меня интересует только возможность возврата константных ссылок, а не ловушки шаблонной функции преобразования. Но если вам интересно, для чего это нужно, это относительно просто:

TemplateClass -> Преобразование (преобразовано в байтовые данные) -> Файл
TemplateClass <- Преобразование (изменено обратно из байтовых данных) <- Файл </p>

Ожидается, что пользователь будет знать, что он получает, или он должен быть автоматизирован (т.е. сохранять / загружать состояния). И да, существует универсальный метод для шаблонов, использующих указатели для преобразования любого типа в байтовые данные.

И не дай мне хлопать о том, что я уже делаю подобные вещи. Процесс преобразования является частью более сложной настройки библиотеки классов.

Я программист. Доверьтесь мне. C ++ доверяет мне и позволяет мне делать ошибки. Только так я научусь.

1 Ответ

2 голосов
/ 30 сентября 2011

Во-первых, ваш оператор преобразования уже имеет неопределенное поведение, потому что вы возвращаете ссылку (постоянную или нет) на локальную переменную, которая вышла из области видимости.Это должно работать нормально, если вы измените свой оператор преобразования, чтобы он возвращал значение, которое не будет вызывать UB.

EDIT: (удалена неверная информация об операторах преобразования).

Но вы действительно уверены, чтоВы действительно хотите, чтобы ваш тип класса был конвертируемым во что угодно?Похоже, что в будущем у вас будет много головной боли, когда вы будете поддерживать код, и он автоматически преобразуется в неожиданный тип.

Другая возможная реализация - создать шаблонный метод as, который в основном выполняетчто ваш конверсионный оператор хочет сделать и назвать это как obj.as<int>().

...