给定模板传递引用转换/类型转换操作符(不带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 pass-by-reference?
上下文
在大多数人进来并且对于如何“无法将其转换为任何内容”感到愤怒之前,您需要具备背景信息。上面的代码是伪代码 - 我只对const引用返回感兴趣,而不是模板化转换函数的缺陷。但如果你想知道它的用途,那就相对简单了:
TemplateClass - &gt;转换(转换为字节数据) - &gt;文件
TemplateClass&lt; - 转换(从字节数据改回)&lt; - File
用户应该知道他们正在取出什么,或者预计会自动化(I.E.保存/加载状态)。是的,有一种通用的模板方法,使用指针将任何类型转换为字节数据。
并且不要谴责std做过这种事情。转换过程是更复杂的类库设置的一部分。
我是程序员。相信我。 C ++信任我,让我犯错误。只有这样我才会学习。
答案 0 :(得分:2)
首先,您的转换运算符已经是未定义的行为,因为您将引用(const或不返回)返回到超出范围的局部变量。如果您将转换运算符更改为不会导致UB的值返回,它应该可以正常工作。
编辑:(删除了有关转换运算符的错误信息)。
但你真的确定你真的希望你的班级类型可以转换成任何东西吗?这似乎只是在您维护代码时会引起许多麻烦,并且它会自动转换为意外类型。
另一种可能的实现方法是创建一个as
模板方法,该方法基本上可以执行转换运算符要执行的操作,并将其称为obj.as<int>()
。