簡體   English   中英

對不同類型使用具有不同返回的模板函數不起作用

[英]Using a template function with different returns for different types doesn't work

所以我寫了類似的東西:

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和向量不匹配。

我做錯了什么以及如何正確編寫模板函數以返回依賴於調用它的參數的不同類型。 例如,當我打電話時:

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

作為替代方案,使用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));
}

模板參數在編譯時確定。 您可以通過模板專業化來完成它。 不要使用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>();

BTW: MyClass some_class(); 不符合你的期望。 看到最煩惱的解析

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM