我需要创建一个存储多个用户定义类型的类。它应该根据需要返回其中一个。有没有办法实现一个函数来返回所有类型?
请注意:我不能使用Boost库。我需要在Visual Studio中实现
class One {};
class Two {};
class Three {};
enum Type
{
OneType,
TwoType,
ThreeType
};
class GenericType
{
template <typename T> // --- How to implement this function
T getValue(Type type)
{
switch(type)
{
case One: return oneType; // Error
case Two: return twoType;
case Three: return threeType;
}
}
shared_ptr<OneType> oneType;
shared_ptr<TwoType> twoType;
shared_ptr<ThreeType> threeType;
Type m_type;
};
答案 0 :(得分:1)
在C ++ 11中,你有一个std::tuple
类来完成这项工作。您可以使用std::get
检索所需的元素,如下所示:
// Create a tuple
std::tuple<std::shared_ptr<OneType>, std::shared_ptr<TwoType>> tuple{null, null};
// Get element
std::get<std::shared_ptr<OneType>>(tuple)
答案 1 :(得分:1)
此声明,
template <typename T> // --- How to implement this function
T getValue(Type type)
...其中Type
是enum
,使运行时选择参数确定函数结果类型的编译时选择,或者要求参数值的运行时选择与编译时选择类型。
前者是落后的,所以它没有开启,后者只是愚蠢。
如果普通的功能模板适合您,那么解决方案很简单:为每种相关类型专门设置它。
如果需要选择运行时,则使用通用的结果包装类型。对于值语义,它可以是具有union
成员的类,即区分联合。对于引用语义,它可以是指向可能结果类型的公共基类的指针。