如何基于枚举参数返回其他类型

时间:2019-06-27 18:10:51

标签: c++ templates sfinae std-variant stdany

我有两个功能需要满足以下条件:

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

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

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

我尝试使用std :: get,因为您可以使用数字来指定类型。 但是,它要求SelectedType是不是的常量表达式。

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

重点是使用 one 变量以避免代码重复。

考虑以下代码:

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:*/ }



1 个答案:

答案 0 :(得分:4)

您不能基于传递给该函数的枚举值返回其他类型。函数签名是在编译时设置的,因此要更改它的任何内容都必须是编译时构造。

如果必须返回只能在运行时知道的其他类型,则可以使用std::variantstd::anystd::variant本质上是带标记的联合,因此您必须指定它可以容纳的类型。如果您有一组有限的类型,则这是首选的数据结构。如果您拥有无限制的类型集,则可以使用std::any。它使用类型擦除和动态内存分配,因此它的使用成本比std::variant高得多,但这是要获得无限灵活性所必须付出的代价。

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