根据请求存储多种类型并返回单一类型

时间:2016-11-11 16:29:51

标签: c++ templates types type-conversion

我需要创建一个存储多个用户定义类型的类。它应该根据需要返回其中一个。有没有办法实现一个函数来返回所有类型?

请注意:我不能使用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;
};

2 个答案:

答案 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)

...其中Typeenum,使运行时选择参数确定函数结果类型的编译时选择,或者要求参数值的运行时选择与编译时选择类型。

前者是落后的,所以它没有开启,后者只是愚蠢。

如果普通的功能模板适合您,那么解决方案很简单:为每种相关类型专门设置它。

如果需要选择运行时,则使用通用的结果包装类型。对于值语义,它可以是具有union成员的类,即区分联合。对于引用语义,它可以是指向可能结果类型的公共基类的指针。