[英]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);}
我不確定。 不過,這是否就是您要的。
我了解以下內容:我想創建一個函數,其返回類型取決於其參數。 好吧,從技術上講,你不能。
當這些返回類型是具有共同祖先的類時,您可以返回指向該祖先的指針。 這不是完全一樣的東西,但是可以。 不幸的是,兩個返回類型是char
和int
,它們不是第一位的類。
如果這些返回類型是普通的舊數據類型,則可以返回帶標簽的聯合。 不幸的是,返回類型之一是std::string
,它不是普通的舊數據類型。
可以與任何類型配合使用但非常令人討厭的解決方案是使用void*
。 好吧,不幸的是, void*
容易出錯。 如果您使用void*
則維護代碼的人將永遠詛咒您。
可行的最終解決方案(雙關語無用)是使用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.