2011-09-30 4 views
-2

Учитывая шаблон пройти по ссылке преобразования/типа произнесения оператора (без сопзЬ) возможно:C++ преобразование Const пройти по ссылке

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;} 
}; 

Производит эти ошибки:

error: cannot convert 'TestA' to 'int' in assignment
error: cannot convert 'TestA' to 'float' in assignment

Вопрос

Как сделать так, чтобы оператор преобразования/типа-литья возвращал const-by-reference типа шаблона?

Контекст

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

TemplateClass -> Conversion (включена в данные байт) -> Файл
TemplateClass < - Преобразование (меняется обратно из данных байт) < - Файл

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

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

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

+0

@Als: Вы имеете в виду, как этот метод преобразования ... в классе, прямо там? – SSight3

+4

Как общий совет: вы не должны возвращать ссылки на временные значения. Вместо этого возвращайте значение: 'operator TheType() const {...}', в противном случае вы можете создать ссылку на свидание. –

+0

@ Он уже делает это с функциями преобразования. Я думаю, что вы хотели сказать, что «Do ** not ** использовать функции преобразования для этого». –

ответ

2

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

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

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

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

+0

Ваше первое предложение абсолютно правильно. Остальная часть вашего ответа ... ну, операторы преобразования - это одно место, где C++ допускает перегрузку на основе типа результата (обратите внимание, что тип результата не является, строго говоря, перегрузкой на основе типа возврата - это часть имени оператора) –

+0

Я думал, что было бы гарантировано, что временные файлы не будут уничтожены до тех пор, пока операция, в которой они используются (IE-назначение) выходит за рамки. Если он работает для передачи по копии (и класс шаблона не будет иметь дело с малыми int и float - мы говорим о монстрах, таких как массивы const char и большие классы для графики), он должен работать для передачи по ссылке, заданной временный, будь то по копиям или ссылке, не будет выходить за пределы области действия до тех пор, пока назначение не будет завершено. Конечно? – SSight3

+0

«Но ты действительно уверен» ... Я абсолютно уверен. Поверьте мне, как программисту, я знаю об ошибках в обычных обстоятельствах, но я использую низкоуровневое преобразование двоичных данных, загрузку классов из файлов IE памяти, поэтому он может работать для любого типа, но пользователь должен знать, что хранится в файле (или ожидается, что он будет автоматизирован для них). Но это не отвечает на мой вопрос относительно ссылки на шаблон const. – SSight3

 Смежные вопросы

  • Нет связанных вопросов^_^