C++ 如何基于枚举参数返回不同的类型
我有两个功能,需要以下功能: 函数1:需要变量的地址来设置值。它知道正确的类型 函数2:是一个重载函数,需要类型的值 我需要一种基于指定要使用的类型的枚举返回不同类型的方法 我尝试使用std::get,因为您可以使用数字来指定类型。 但是,它要求SelectedType是一个常量表达式,而不是C++ 如何基于枚举参数返回不同的类型,c++,templates,sfinae,std-variant,stdany,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>
std::variant<uint8_t,int8_t,uint16_t,int16_t,double,float> Var;
std::get<SelectedTypeEnum>(Var)
不能根据传递给函数的枚举值返回其他类型。函数签名是在编译时设置的,因此任何改变它的东西都必须是编译时构造 如果必须返回只有在运行时才能知道的不同类型,那么可以使用std::variant或std::any。variant基本上是一个带标签的联合体,所以您必须指定它可以包含哪些类型。如果您有一组有界的类型,则这是首选的数据结构。如果有一组无限的类型,那么可以使用std::any。它使用类型擦除和动态内存分配,因此使用它比使用std::variant要昂贵得多,但这是获得无限灵活性所需的成本
如果对用例有意义的话,另一种选择是让所有类型从公共基类型继承。然后,您可以从函数返回指向base的指针,但可以使用对象多态性。您不能基于传递给函数的枚举值返回其他类型。函数签名是在编译时设置的,因此任何改变它的东西都必须是编译时构造 如果必须返回只有在运行时才能知道的不同类型,那么可以使用std::variant或std::any。variant基本上是一个带标签的联合体,所以您必须指定它可以包含哪些类型。如果您有一组有界的类型,则这是首选的数据结构。如果有一组无限的类型,那么可以使用std::any。它使用类型擦除和动态内存分配,因此使用它比使用std::variant要昂贵得多,但这是获得无限灵活性所需的成本
如果对用例有意义的话,另一种选择是让所有类型从公共基类型继承。然后,您可以从函数返回一个指向base的指针,但要处理对象多态性。模板自动GetTypeToUse如何?类型可以是编译时常量吗?哦,这部分已经由我正在使用的库提供了,我为上下文添加了它。我需要弄清楚如何编写函数2。函数1只有一种类型,因此您可以只执行&std::any_castC++是一种强类型语言。每个函数都有一个固定的返回类型。但是,您要做的是,根据函数参数值,要求函数具有多个返回类型,这与强类型性相矛盾,因此,不,您将无法达到目标,至少无法达到您想要的方式…模板自动获取类型如何?类型可以是编译时常量吗?哦,这部分已经由我正在使用的库提供了,我为上下文添加了它。我需要弄清楚如何编写函数2。函数1只有一种类型,因此您可以只执行&std::any_castC++是一种强类型语言。每个函数都有一个固定的返回类型。但是,您要做的是,根据函数参数值的不同,要求您的函数具有多个返回类型,这与强类型性相矛盾,因此,不,您将无法达到目标,至少无法达到您想要的方式。。。
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:*/ }