我想将一些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 ++函数提供世界上最简单的函数来返回不同类的实例,那将非常感激。
答案 0 :(得分:2)
如评论中所述,这里真正的问题是:如何从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功能的更详细介绍,请参见tutorial。
如果在编译时不知道可能的返回类型或它们的数量很大,我们也可以使用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很可能是解决问题的更好工具。
答案 1 :(得分:1)
如果这些类可以从一个接口继承,那么可以使用抽象接口类。
//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);
}
}