代码之家  ›  专栏  ›  技术社区  ›  Niteraleph

对不同类型使用具有不同返回的模板函数是行不通的

  •  3
  • Niteraleph  · 技术社区  · 7 年前

    所以我写了这样的东西:

    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_integer some_number

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jarod42    7 年前

    作为替代方案,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));
    }
    
        2
  •  1
  •   songyuanyao    7 年前

    模板参数在编译时确定。您可以通过模板专门化来完成它。不使用 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(); 没有达到你的期望。看见 most vexing parse .