能够返回不同类型的函数?

新手上路,请多包涵

我正在尝试在 C++ 中创建一个函数,我想知道我是否可以创建它以便它能够返回不同类型的向量。例如,根据不同的大小写,它返回向量字符串、int、double 或…任何东西。在 C++ 中可以吗? (我不想使用具有不同 arg(S) 和不同返回值的重载函数)我对 C++ 很陌生,我的问题可能看起来很愚蠢。

这是我的一段代码:

//这里的零表示相交

std::vector<??????> findZeros(const mesh::Region& s, char *model) const
{
//Point
  if( model == "point" )
  {
    std::vector<Vertex> zeros;
    for(Region::pointIterator it = s.beginPoint(); itv != s.endPoint(); ++itv )
    {
      if( abs(Val(*it)) < 1.e-12 )
      zeros.push_back(*it);
    }
    std::vector<point> zerosP(zeros.begin(), zeros.end());
    return zerosP;
  }
 //line
  else if (EntityS == "line")
  {
    std::vector<line> zerosE;
    std::vector<Point&> PointE;
    for(Region::lineIterator ite = s.beginLine(); ite != s.endLine(); ++ite )
    {
      Line ed = *ite;
        Point P0 = ed.point(0);
        Point P1 = e.point(1);
        if( ......... ) zerosE.push_back(ed);
        else if ( ....... )
        {
         PontE.push_back( P0, P1);
         zerosE.push_back(ed);
        }
      }

//这里我想返回“点”或“带有点的线”或在我们的表面上层。 //我想在一个功能中完成所有事情! }

原文由 user2090491 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 262
1 个回答

模板

尝试这个:

 template <typename T>
std::vector<T> func( /* arguments */ )
{
    std::vector<T> v;
    // ... do some stuff to the vector ...
    return v;
}

您可以通过以下方式调用不同类型的此函数:

 std::vector<int> func<int>( args );
std::vector<double> func<double>( args );

备择方案

如果您在编译时知道类型,这是一种方法。如果您在编译时不知道类型,而只在运行时知道,那么您有不同的选择:

  1. 使用 unions 。如果您有非常简单的类似 C 结构的类型,在 C++ 标准中称为 POD(普通旧数据),我只能推荐这个。
  2. 使用某种类型的变体。例如 boost::variant 来自 Boost 库或 QVariant 来自 Qt 库。它们是更通用类型上的一种安全联合。它们还允许在不同类型之间进行一些转换。例如,将某些内容设置为整数值将可以读取与浮点数相同的值。
  3. 使用 boost::any 可以包装任何类型但不允许它们之间的转换。
  4. 使用继承和多态。对于这种情况,您需要一个公共基类,例如 Base 。然后,您最好使用 std::shared_ptrs 创建指向该基础的指针数组。所以数组类型将是 std::vector<std::shared_ptr<Base>> 。在这种情况下, std::shared_ptr 比内置指针更好,因为它通过引用计数自动管理您的内存。
  5. 使用不关心类型和性能的动态语言。

原文由 Ralph Tandetzky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题