我创建了一个不同数据类型的结构,我想返回每种类型的数据。这是否可以使用函数模板来完成,该函数模板采用不包含在结构中的不同数据参数或没有参数?
我有类似的东西,
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
}
答案 0 :(得分:4)
是:
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>
答案 1 :(得分:1)
以下是建立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);}
我不确定。不过,这是否是你所要求的。
答案 2 :(得分:1)
我的理解如下:我想创建一个函数,其返回类型取决于其参数。嗯,从技术上讲,你不能。
当这些返回类型是具有共同祖先的类时,您可以返回指向该祖先的指针。这不是一回事,但它确实有效。不幸的是,其中两种返回类型是char
和int
,它们首先不是类。
当这些返回类型是普通旧数据类型时,您可以返回标记的联合。不幸的是,其中一种返回类型是std::string
,它不是普通的旧数据类型。
适用于任何类型的解决方案,但令人难以置信的是黑客使用void*
。好吧,不幸的是,void*
容易出错。如果您使用void*
,那么维护您的代码的人将永远诅咒您。
有效的最终解决方案(双关语)是使用boost::variant
。它非常复杂,但至少它是安全的(与void*
不同),因为可以在编译时检查类型错误。
答案 3 :(得分:0)
以下是另一种不使用模板的解释:
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);