-1

给定模板传递引用转换/类型转换运算符(没有 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 -> Conversion(变成字节数据)-> File
TemplateClass <- Conversion(从字节数据变回)<- File

用户应该知道他们得到了什么,或者它应该是自动化的(IE 保存/加载状态)。是的,模板有一种通用方法,使用指针将任何类型转换为字节数据。

并且不要给我拍手称std已经在做这种事情了。转换过程是更复杂的类库设置的一部分。

我是一名程序员。相信我。C++ 信任我,让我犯错。只有这样我才会学习。

4

1 回答 1

2

首先,您的转换运算符已经是未定义的行为,因为您返回了对超出范围的局部变量的引用(无论是否为 const)。如果您将转换运算符更改为按值返回而不会导致 UB,它应该可以正常工作。

编辑:(删除了有关转换运算符的不正确信息)。

但是你真的确定你真的希望你的类类型可以转换成任何东西吗?当您维护代码并自动转换为意外类型时,这似乎只会在未来引起很多麻烦。

另一种可能的实现是创建一个as模板方法,该方法基本上可以完成您的转换运算符想要做的事情,并将其称为obj.as<int>().

于 2011-09-30T15:23:52.320 回答