我需要一个返回变量的函数,但是我不想指定它将返回什么类型的变量(需要在以后的使用中确定)。
// 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] 删除。
我来说两句