簡體   English   中英

使用功能模板

[英]Using Function Templates

我創建了一個不同數據類型的結構,我想返回每種數據類型。 使用功能模板可以做到這一點,該功能模板接受結構中不包含的其他數據參數或沒有參數?

我有這樣的事情

struct mystruct{
int _int;
char _c;
string _str
};

In function template(int i)
{
     mystruct s;

      switch (getInput)
     {
      case 1:
        return s._int;
      case 2:
        return s._c;
      case 3:
        return s._str;
   }   
} 

void main()  

{
   int getInput = 1;
   //pass getInput value to function template
}

是:

template<class T>
T f() {
  return 0; // for the sake of example
}

int main() {
  return f<int>(); // specify the template parameter
}

template<class T>
vector<T> another_example();
// use another_example<int>() which returns a vector<int>

以下是GMan對您非常困惑的問題的解釋(現已刪除)的構建:

struct some_data
{
    int i;
    char c;
    std::string s;
};

template< typename T > struct Getter;
template<> struct Getter<int> { static int& get(some_data& data) {return data.i} };
template<> struct Getter<char> { static char& get(some_data& data) {return data.c} };
template<> struct Getter<std::string> { static std::string& get(some_data& data) {return data.s} };

template< typename T >
inline T get(some_data& data) {return Getter<T>::get(data);}

我不確定。 不過,這是否就是您要的。

我了解以下內容:我想創建一個函數,其返回類型取決於其參數。 好吧,從技術上講,你不能。

  1. 當這些返回類型是具有共同祖先的類時,您可以返回指向該祖先的指針。 這不是完全一樣的東西,但是可以。 不幸的是,兩個返回類型是charint ,它們不是第一位的類。

  2. 如果這些返回類型是普通的舊數據類型,則可以返回帶標簽的聯合。 不幸的是,返回類型之一是std::string ,它不是普通的舊數據類型。

  3. 可以與任何類型配合使用但非常令人討厭的解決方案是使用void* 好吧,不幸的是, void*容易出錯。 如果您使用void*則維護代碼的人將永遠詛咒您。

  4. 可行的最終解決方案(雙關語無用)是使用boost::variant 這很復雜,但是至少是安全的(不同於void* ),因為可以在編譯時檢查類型錯誤。

這是另一種不使用模板的解釋:

struct some_data
{
    int i;
    char c;
    std::string s;

    void get(int& value) const
         { value = i; }
    void get(char& value) const
         { value = c; }
    void get(& value) const
         { value = s; }
};

// ...
some_data received_data;
int k;
received_data.get(k);
//...
received_data.s = "Hello";
std::string world;
received_data.get(world);
std::cout << world << std::endl;

編譯器將根據參數的類型生成正確的方法調用。 可以將其轉換為非成員函數:

void Get_Some_Data(char& value, const some_data& sd)
{
    value = sd.c;
    return;
}


void Get_Some_Data(int& value, const some_data& sd)
{
    value = sd.i;
    return;
}

void Get_Some_Data(std::string& value, const some_data& sd)
{
    value = sd.s;
    return;
}

//...
char f;
Get_Some_Data(f, received_data);

暫無
暫無

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

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