C++ преобразование const передача по ссылке
Для данного шаблона возможно преобразование / преобразование типа по ссылке (без 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;
}
И учитывая следующий код (с const):
class TestA
{
public:
//Produces error
template<typename TemplateItem>
operator const TemplateItem&() const {TemplateItem A; A = 10; return A;}
};
Выдает эти ошибки:
ошибка: не удается преобразовать TestA в int в назначении
ошибка: не удается преобразовать 'TestA' в 'float' в присваивании
Вопрос
Как мне сделать так, чтобы оператор преобразования / приведение типа возвращал константную ссылку на тип шаблона?
контекст
Прежде чем большинство людей придут и задумаются о том, что "вы не можете преобразовать это просто во что-то", вам нужен контекст. Приведенный выше код является псевдокодом - меня интересует только возможность возврата константных ссылок, а не ловушки шаблонной функции преобразования. Но если вам интересно, для чего это нужно, это относительно просто:
TemplateClass -> Conversion (превращается в байтовые данные) -> File
TemplateClass <- Преобразование (изменено обратно из байтовых данных) <- Файл
Ожидается, что пользователь будет знать, что он получает, или он должен быть автоматизирован (сохранение / загрузка IE). И да, существует универсальный метод для шаблонов, использующих указатели для преобразования любого типа в байтовые данные.
И не давай мне хлопать о том, что я уже делаю подобные вещи. Процесс преобразования является частью более сложной настройки библиотеки классов.
Я программист. Доверьтесь мне. C++ доверяет мне и позволяет мне делать ошибки. Только так я научусь.
1 ответ
Во-первых, ваш оператор преобразования уже имеет неопределенное поведение, потому что вы возвращаете ссылку (постоянную или нет) на локальную переменную, которая вышла из области видимости. Это должно работать нормально, если вы измените свой оператор преобразования, чтобы он возвращал значение, которое не будет вызывать UB.
РЕДАКТИРОВАТЬ: (удалены неверные данные об операторах конвертации).
Но действительно ли вы уверены, что действительно хотите, чтобы ваш тип класса был конвертируемым во что угодно? Кажется, что в будущем у вас будет много головной боли, когда вы будете поддерживать код, и он автоматически преобразуется в неожиданный тип.
Другой возможной реализацией является создание as
шаблонный метод, который в основном делает то, что хочет сделать ваш оператор преобразования, и называет это как obj.as<int>()
,