#include
using namespace std;
template void swap(T &a,T &b){
T temp;
temp = a;
a = b;
b = temp;
}
int main(){
char s1[] = "Hello",s2[] = "hi";
swap(s1,s2);//为什么这样写不对
}
因为char[6]和char[3]不能用你的模板T表示,它们也不是一个类型
#include<iostream>
using namespace std;
template <class T>
void swap(T &a,T &b){
T temp;
temp = a;
a = b;
b = temp;
}
int main(){
string s1 = "Hello", s2 = "hi";
swap(s1,s2);
cout << s1 << endl << s2;
}
数组类型的交换怎么可以直接用等于号赋值呢
#include <type_traits>
using namespace std;
namespace MyNamespace
{
template <typename T, typename = enable_if_t<is_assignable_v<T&, T>>>
void swap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template <typename T, size_t N, typename = enable_if_t<is_assignable_v<T&, T>>>
void swap(T(&a)[N], T(&b)[N])
{
for (size_t i = 0; i < N; ++i)
swap(a[i], b[i]);
}
template <typename T1, typename T2>
void swap(T1& a, T2& b)
{
static_assert(is_assignable_v<T1&, T2> && is_assignable_v<T2&, T1>); // 静态断言需要c++17
}
void example()
{
int x = 1, y = 2;
swap(x, y);
char s1[] = "s1", s2[] = "s2";
swap(s1, s2);
char s3[] = "Hello", s4[] = "hi";
//swap(s3, s4);
//error : 静态断言失败; T1 = char[6], T2 = char [3]
}
}
int main()
{
MyNamespace::example();
}