对不同类型使用具有不同收益的模板函数不起作用

尼特拉弗

所以我写了这样的话:

class MyClass
{
    enum varType {INTEGER, DOUBLE, VECTOR};

    int beautiful_integer;
    double awesome_double;
    std::vector<float> many_floats;

    template <class T>
      T getVariable(varType type)
      {
          if(type == INTEGER)
          {
             return beatiful_integer;
          }
          if(type == DOUBLE)
          {
             return awesome_double;
          }
          if(type == VECTOR)
          {
             return many_floats;
          }
      }

...

};

但是我的编译器抛出错误“ ...的实例化”,并基本上告诉我返回类型不匹配(并列出了所有不匹配的类型,除了正确的类型除外),然后尝试用另一种类型实例化(用于示例double),并告诉我返回类型与int和float的向量不匹配。

我在做什么错以及如何正确编写模板函数以返回依赖于调用它的参数的不同类型。例如,当我打电话时:

MyClass some_class(); //EDIT: this should be MyClass some_class; 
                      //thanks for pointing it out
int some_number = some_class.getVariable(INTEGER);

我想将的值分配beautiful_integersome_number

songyuanyao

模板参数在编译时确定。您可以通过模板专门化来完成。不要使用enum例如

class MyClass
{
    int beautiful_integer;
    double awesome_double;
    std::vector<float> many_floats;

    template <class T>
    T getVariable();

    template<>
    int getVariable<int>
    {
        return beatiful_integer;
    }

    template<>
    double getVariable<double>
    {
        return awesome_double;
    }

    template<>
    std::vector<float> getVariable<std::vector<float>>
    {
        return many_floats;
    }

};

从C ++ 17开始,您还可以使用Constexpr If,例如

template <class T>
T getVariable()
{
    if constexpr (std::is_same_v<T, int>)
    {
        return beatiful_integer;
    } 
    else if constexpr (std::is_same_v<T, double>)
    {
        return awesome_double;
    } 
    else if constexpr (std::is_same_v<T, std::vector<float>>)
    {
        return many_floats;
    } 
    else
    {
        ...
    }
}

然后

MyClass some_class;
int some_number = some_class.getVariable<int>();

顺便说一句:MyClass some_class();没有按照您的期望做。看到最烦人的解析

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有许多不同类型的C ++调用函数

如何使用具有不同变量集的模板模块?

2在不同类中具有相同名称的扩展方法在Scala 3中不起作用?

如何使用具有不同类的多个属性的linq`Except`?

具有不同类型的Django ArrayField

有没有办法使用具有相同名称但返回类型不同的函数?

具有两个不同类型参数的隐式模板类型推导

具有不同类型的copy_if

具有不同类型的模板非类型参数

在具有相同名称的不同名称空间中摇摇欲坠的不同类不起作用

返回具有不同模板参数值的不同类型(但类型相同)

具有不同类型元素的数组

为什么我的Plotly表达人物不起作用?-“ ValueError:Plotly Express无法处理具有不同类型的列的宽格式数据。”

从类到具有不同模板类型的相同类的转换

C ++:使用模板折叠具有不同类型和功能的重复代码

Matlab函数具有许多不同类型的输入

遍历具有不同类型的列表

具有不同SSID的接入点不起作用

使用不同类型的异常还是使用具有不同代码的单个异常类型会更好吗?

是否可以同时使用具有不同类型配置的 ICacheManager<>?

在 C# 中,如何使用具有两种不同类型的泛型?

使用具有不同变量的函数

具有不同类型节点的图

模拟调用具有不同类的类构造函数

使用具有两种不同类型的运算符

动态调用具有不同返回类型的同名函数

使用具有不同 order by 子句的 postgres 窗口函数

std::invoke_result 在具有自动返回类型的模板函数中不起作用

如何调用具有不同类作为参数的函数