【发布时间】:2011-09-30 15:12:41
【问题描述】:
给定模板传递引用转换/类型转换运算符(不带 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”
问题
如何使转换/类型转换运算符返回模板类型的 const 传递引用?
上下文
在大多数人进来并为“您无法将其转换为任何东西”而感到震惊之前,您需要了解上下文。上面的代码是伪代码——我只对可能的 const 引用返回感兴趣,而不是模板化转换函数的缺陷。但如果你想知道它的用途,那就相对简单了:
TemplateClass -> 转换(转成字节数据) -> 文件
TemplateClass
用户应该知道他们正在输出什么,或者应该是自动化的(即保存/加载状态)。是的,模板有一种通用方法,使用指针将任何类型转换为字节数据。
而且不要给我吹嘘 std 已经在做这种事情了。转换过程是更复杂的类库设置的一部分。
我是一名程序员。相信我。 C++ 信任我,让我犯错。只有这样我才能学习。
【问题讨论】:
-
@Als:你的意思是,像那种转换方法……在课堂上,对吗?
-
一般建议:您不应返回对临时值的引用。而是返回一个值:
operator TheType() const {...},否则,您可能会产生一个悬空引用。 -
@Als 他已经用转换功能做到了。我认为您的意思是“不要不使用转换函数来这样做。”
-
@JohannesSchaub-litb:啊,感谢您纠正这个错字。我要删除那个。
-
@SS 第一句话是错的。我建议阅读 C++ 规范。我不知道你的其他陈述是什么意思。
标签: c++ templates operator-overloading conversion-operator