C ++转换const传递引用

时间:2011-09-30 15:12:41

标签: c++ templates operator-overloading conversion-operator

给定模板传递引用转换/类型转换操作符(不带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 ++信任我,让我犯错误。只有这样我才会学习。

1 个答案:

答案 0 :(得分:2)

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

编辑:(删除了有关转换运算符的错误信息)。

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

另一种可能的实现方法是创建一个as模板方法,该方法基本上可以执行转换运算符要执行的操作,并将其称为obj.as<int>()