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。这是它的变体。下面是一个演示我们需要的基本特性的小示例:
#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);
}
}
相关文章:
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 了解 Python 中的对象类型
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 基准、值、值类型、对象和对象类型(C++)
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- 在构造过程中更改的对象类型
- 如何构建程序以避免查询对象类型?
- 如何使用Dynamic_cast获得对象类型
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 类返回对象类型,但如何返回和检查 null
- 是否可以在辅助功能中概括对象类型
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 当将对象传递给具有参数作为引用类型的函数以及当其类对象类型时,会得到不同的输出
- 如何在运行时指定对象类型
- 我可以获取在重载的新运算符中使用新运算符的对象类型吗?