C++ 从函数返回多个类型引用并将它们强制转换为我们需要的类型
C++ Returning multiple type references from function and casting them to a type that we need
我需要一个返回变量的函数,但我不想指定它将返回的变量类型(这是以后使用中要确定的)。
// 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();
}
};
编辑:更改了访问控制。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换