繁体   English   中英

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

[英]boost c++ method returning different object types

我想将我的一些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.variant 这是一个小示例,演示了我们需要的基本功能:

#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.variant功能的更详细的介绍。

如果可能的返回类型在编译时未知,或者它们的数量很大,我们也可以使用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.variant很有可能是解决问题的更好工具。

如果该类可以从一个接口继承,则可以使用抽象接口类。

//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);
     }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM