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

时间:2018-01-12 01:56:18

标签: c++ templates return-type

所以我写了类似的东西:

Foo.save()

但我的编译器抛出错误“在实例化...”并且基本上告诉我返回类型不匹配(并列出所有不匹配的,除了正确的),然后尝试用另一个实例化它type(例如double)并告诉我返回类型与浮点数的int和向量不匹配。

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

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;
          }
      }

...

};

我想将MyClass some_class(); //EDIT: this should be MyClass some_class; //thanks for pointing it out int some_number = some_class.getVariable(INTEGER); 的值分配给beautiful_integer

2 个答案:

答案 0 :(得分:2)

另外,使用std:

template <class T>
const T& getVariable() const
{
    return std::get<const T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}

template <class T>
T& getVariable()
{
    return std::get<T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}

答案 1 :(得分:1)

模板参数在编译时确定。您可以通过模板专业化来完成它。不要使用enum。 e.g。

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>();

BTW:MyClass some_class();没有达到您的预期。请参阅most vexing parse