C ++从函数返回多个类型引用并将其转换为我们需要的类型

我需要一个返回变量的函数,但是我不想指定它将返回什么类型的变量(需要在以后的使用中确定)。

// unknownType is a char, because it uses only one byte of memory
typedef char unknownType;

unknownType& func (bool typeSelector) {
    // let's say we want to return double and int type
    double dblVal = 3.5;
    int intVal = 5;

    // return type depends on typeSelector's state
    if (typeSelector == true)
        return (unknownType&)dblVal;
    else
        return (unknownType&)intVal;
}

然后我将像这样使用它:

double dblVal = (double&) func(true);

std::cout << dblVal << std::endl;
std::cout << (int&) func(false);

上面的代码工作得很好(如果我不尝试返回更复杂的对象,例如std :: string,但是我的需求就可以了);我已经在Linux和Windows上进行了编译。但是我不确定这是否是我的问题的便携式解决方案。

我的问题是:此代码中是否有任何内容可能会使我的程序崩溃并使它变得毫无用处?从性能方面来说,效率如何?

编辑:为什么我不能在这里使用模板

我有一个基础课:

class Base {
public:
    virtual unknownType& getValue () = 0;
};

然后是几个派生类,其中包含不同的类型变量:

class DerivedDbl : public Base {
private:
    double value;
public:
    DerivedDbl (double val) : value(val) {}

    unknownType& getValue () {
        double toReturn = value;
        return (unknownType&)toReturn;
    }
};

class DerivedInt : public Base {
private:
    int value;
public:
    DerivedInt (int val) : value(val) {}

    unknownType& getValue () {
        int toReturn = value;
        return (unknownType&)toReturn;
    }
};

然后,我有了一个类,该类存储派生类并对其进行一些操作:

class Storage {
private:
    std::vector <Base*> vec;
public:
    void operator+= (Base& obj) { vec.push_back(&obj); }

    unknownType& operator[] (int ID) {
        return vec[ID]->getValue();
    }
};

而且我有时希望能够获取存储的派生类的变量值(我知道我添加了哪个类,所以我知道了它们的类型),但是我不认为为每个类创建单独的getter方法并不那么优雅获取它们的方式,这样的代码对我来说更清晰:

DerivedDbl derivedDbl(3.5);
DerivedInt derivedInt(5);

Storage storage;
storage += derivedDbl;
storage += derivedInt;

std::cout << (double&)storage[0] << std::endl;
std::cout << (int&)storage[1];

但是也许有一些我想念的东西,并且有可能使用不同的方法来做同样的事情(我尝试过模板并且没有提出任何好主意,你们劝阻了虚指针,联合和结构需要更多的内存)。

用户名

您正在返回对局部变量的引用。有时这似乎可行,但是它是不确定的行为,在某些时候会严重破坏您的程序。

如果您确实需要一个虚函数,它可能应该返回某种类型的隐藏类(例如boost :: any)。然后,您可以将返回值转换为正确的类型。

或者,您可以使函数为非虚拟函数,并将其从基本类型转换为适当的派生类型。然后,派生类可以只返回您实际想要的类型。

可以使用模板来促进这种行为,例如:

class Base
{
public:

    virtual ~Base() { }
};

template<class T>
class ValueType : public Base
{
public:

    explicit ValueType(T value): value(value) { }

    T& GetValue()
    {
        return value;
    }

private:

    T value;
}

struct Storage
{
    std::vector<Base*> objects;

    template<class T> 
    T& GetValue(unsigned int index)
    {
        auto derived = dynamic_cast<ValueType<T>*>(objects[index]);

        return derived->GetValue();
    }
};

编辑:更改访问控制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们在C中将整数值转换为指针类型

如果返回类型是C ++中的对象,我们可以在函数定义中使用绝对名称空间吗?

为什么我们不能将int变量与c中的int返回类型函数进行比较?

Python SWIG:将C ++返回参数转换为返回值,并将原始C ++类型转换为Python类型

我们可以在C#中使用Struct作为引用类型吗?

如果我们不从c ++中的非void返回类型的函数返回任何内容,返回值是多少?[实验性]

为什么我们需要C ++中的基本数据类型

读取 MySQL JSON 数据类型并将其转换为 C# 中的 List<Int>

我们可以在C语言中使用指针类型转换整数值吗?

为什么我们不能在 C++ 中比较函数数组的类型?

我们如何编写在C ++中返回多个值的函数

C ++函数返回/输入引用类型

为什么在将其强制转换为void *类型之前需要复制Objective-C处理程序?

为什么我们需要C ++中的虚函数?

将Python返回的类型转换为C ++

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

如何从C函数中返回多个类型?

我们将创建一个nullptr并将其用于C ++中的IF条件

为什么我需要在C#显式实现中将'this'转换为接口类型?

C ++需要将int类型转换为unsigned int

C#LengthCalculator错误/需要转换为double类型的对象

为什么我们在c中使用函数返回指针以及函数返回指针的应用

动态转换为函数参数类型 (C++)

为什么在C#方法中我们需要多个`await`语句?

类型转换C函数的返回值是否可以接受?

在C中强制转换函数指针的返回类型

为什么我们需要C ++中的纯虚拟析构函数?

我们到底需要使用类型转换吗?

我们如何从文件中读取并将其存储到 C++ 中的不同对象中?