如何根据枚举参数返回不同的类型

Posted

技术标签:

【中文标题】如何根据枚举参数返回不同的类型【英文标题】:How to return a different type based on a enum argument 【发布时间】:2019-06-27 18:10:51 【问题描述】:

我有两个需要以下功能的功能:

功能1:需要变量的地址来设置值。 (它知道正确的类型)

函数2:是一个需要类型值的重载函数。

我需要一种基于枚举(指定要使用的类型)返回不同类型的方法。

我尝试使用 std::get ,因为您可以使用数字来指定类型。 然而,它要求 SelectedType 是一个常量表达式,而事实并非如此。

std::variant<uint8_t,int8_t,uint16_t,int16_t,double,float> Var;
std::get<SelectedTypeEnum>(Var)

重点是使用一个变量来避免代码重复。

考虑以下代码:

enum Type
Type_uint8_t,
Type_int8_t,
Type_uint16_t,
Type_int16_t,
Type_std::string
 TypeList;

GetTypeToUse(Type&) /* Get/Set the type to use */ 

void SetValueBasedOnEnum(Type TypeToUse,void* ptr) /* Function 1: Sets the value of the type */

// This is a  Overloaded Function which supports all types in the enum. 
//"T" represents the type.
void DoStuffWithDifferentTypes(T ValueOfType)  /*Function 2:*/ 



【问题讨论】:

template &lt;Type type&gt; auto GetTypeToUse() 怎么样? Type 可以是编译时间常数吗? 哦,这部分已经由我正在使用的库提供,我将它添加为上下文。我需要弄清楚如何编写Function 2。使用 Function 1 只有一种类型,因此您只需执行 &std::any_cast C++ 是一种强类型语言。每个函数都有一个固定的返回类型。但是,您打算做的事情要求您的函数具有多个返回类型,具体取决于函数参数值,这与强类型相矛盾,所以不,您将无法到达那里,至少不是这样你打算... 【参考方案1】:

您不能根据传递给函数的枚举值返回不同的类型。函数签名是在编译时设置的,因此任何会改变它的东西都必须是编译时构造。

如果您必须返回只能在运行时知道的不同类型,那么您可以为此使用std::variantstd::anystd::variant 基本上是一个标记联合,因此您必须指定它可以容纳哪些类型。如果您有一组有限的类型,这是首选的数据结构。如果您有一组无限制的类型,那么您可以使用std::any。它使用类型擦除和动态内存分配,因此使用起来比std::variant 贵很多,但这是获得无限灵活性所必须付出的代价。

如果对您的用例有意义,另一种选择是让所有类型都继承自一个通用的基本类型。然后您可以从函数返回一个指向基址的指针,但可以多态地使用该对象。

【讨论】:

以上是关于如何根据枚举参数返回不同的类型的主要内容,如果未能解决你的问题,请参考以下文章

在java中如何将emun枚举类型作为参数传入函数中?

如何让 PHPUnit MockObjects 根据参数返回不同的值?

C++:仅根据函数返回值类型不能实现重载

C#中的枚举类型如何传递参数呢?

如何根据T创建不同行为的泛型方法?

在 Typescript 中按字符串返回不同的类型