Boost c++方法返回不同的对象类型

boost c++ method returning different object types

本文关键字:对象 类型 c++ 方法 返回 Boost      更新时间:2023-10-16

我想把我的一些Python代码移植到c++代码。我现在遇到的问题是,当一个函数可能返回不同的对象类型-说一个类的变量或另一个取决于某些条件(但不取决于参数的类型),几乎像这样:

def somefunc(var):
  # obj1 is instance of Class1
  # obj2 is instance of Class2
  #.... some other code
  if var == 1:
      return obj1
  elif var == 2:
      return obj2

假设我有相应的用c++实现的类。现在我想要的是从某个方法返回一个类的实例或另一个类的实例。我不知道如何处理这个任务-我的c++方法应该看起来像什么,BOOST_PYTHON_MODULE应该看起来像什么。如果有人能提供世界上最简单的例子,用c++函数返回不同类的实例,那将是非常感激的。

正如评论中所说,这里真正的问题是:如何从c++中的同一个函数返回不同的类型?

可以使用boost。这是它的变体。下面是一个演示我们需要的基本特性的小示例:

#include <iostream>
#include <string>
#include <boost/variant.hpp>
boost::variant<int, std::string> fun (bool i) {
    if (i)
        return "Hello boost!n";
    return 4711;
}
int main()
{
    std::cout << fun(true) << fun(false) << std::endl;
}

输出将是

Hello boost!
4711

对boost特性的更详细的介绍。变体可以在他们的教程中找到。

如果在编译时不知道可能的返回类型,或者它们的数量很大,也可以使用boost.any。这个更灵活,但不太直接:

#include <iostream>
#include <string>
#include <boost/any.hpp>
using namespace std::literals::string_literals;
boost::any fun (bool i) {
    if (i)
        return "Hello boost!n"s;
    return 4711;
}
int main()
{
    std::cout << boost::any_cast<std::string>(fun(true)) 
              << boost::any_cast<int>(fun(false)) << std::endl;
}

如果可能,使用boost。

如果这些类可以从一个接口继承,那么你可以使用抽象接口类。

//Interface, abstract class .h file
#pragma once
namespace test
{
    class IClass0
    {
        public:
            virtual bool DoStuff() =0;      
    };
}

//Class1 .h file
#pragma once
#include "IClass0.h"
    namespace test
    {
        class Class1 : public IClass0
        {
            public:
                virtual bool DoStuff();     
        };
    }

//Class2 .h file
#pragma once
#include "IClass0.h"
    namespace test
    {
        class Class2 : public IClass0
       {
            public:
               virtual bool DoStuff();      
        };
    }

然后你可以返回指向创建实例的指针作为接口

 unique_ptr<IClass0> ReturnClassInstance()
 {
     if(condition1)
     {
        unique_ptr<Class1> ptr (new Class1());
        return move(ptr);
     }
     else
     {
        unique_ptr<Class2> ptr (new Class2());
        return move(ptr);
     }
 }