如何解决如何使用模板功能交换2个对象?
如何使用模板功能交换2个对象?我只想使用名为my_swap()
的模板函数在同一类的2个对象之间交换年龄编号。
struct Men
{
std::string name;
int age;
}
std::ostream &operator<<(std::ostream &os,const Men &M)
{
os << M.name;
return os;
}
template <typename T>
void my_swap(T &a,T &b)
{
T temp = a;
a = b;
b= temp;
}
int main()
{
int x{100};
int y{200};
my_swap(x,y);
std::cout << x << "," << y << std::endl;
}
我想做的是:
Men M1{"Jack",10};
Men M2{"Tony",20};
Men M3 = my_swap(M1,M2);
解决方法
您的模板已经可以很好地做到这一点,您只需要在通话中传递age
成员即可,而模板则保持不变:
int main()
{
Men M1{"Jack",10};
Men M2{"Tony",20};
my_swap(M1.age,M2.age); //pass the ages only
std::cout << M1 << "," << M2 << std::endl;
}
或者您可以执行以下操作:
//...
template <typename T>
void my_swap(T &a,T &b)
{
T temp;
temp.age = a.age;
a.age = b.age;
b.age = temp.age;
}
int main()
{
Men M1{"Jack",20};
my_swap(M1,M2); //pass the objects
std::cout << M1 << "," << M2 << std::endl;
}
这只会交换作为参数传递的age
对象中的Men
。
使用:
std::ostream &operator<<(std::ostream &os,const Men &M)
{
os << M.name << " " << M.age;
return os;
}
两个示例都将输出:
Jack 20,Tony 10
该行:
Men M3 = my_swap(M1,M2);
不正确,您的模板的返回类型为void
,无法分配。
您的my_swap()
模板函数执行了完全交换。如果您希望它仅交换age
参数的Men
字段,并完全交换其他类型,则可以使用template specialization来完成,例如:
template <typename T>
void my_swap(T &a,T &b) // <-- primary template for all types
{
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
/* or:
using std::swap;
swap(a,b);
*/
}
...
struct Men
{
std::string name;
int age;
};
template <>
void my_swap<Men>(Men &a,Men &b) // <-- specialization just for Men only
{
int temp = a.age;
a.age = b.age;
b.age = temp;
/* or:
std::swap(a.age,b.age);
*/
}
std::ostream &operator<<(std::ostream &os,const Men &M)
{
os << M.name << " is " << M.age;
return os;
}
int main()
{
int x{100};
int y{200};
my_swap(x,y);
std::cout << x << "," << y << std::endl;
Men M1{"Jack",M2);
std::cout << M1 << "," << M2 << std::endl;
}
输出:
200,100 Jack is 20,Tony is 10
这样,只要在my_swap()
设置为T
的情况下调用Men
,就使用专业化,而在{{1}的情况下,只要使用my_swap()
,就会使用主模板}}设置为其他任何类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。