C++模板友元函数(二)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
C++模板编程与泛型编程之类模板中的友元二
文章目录
让函数模板的某个实例成为友元函数
-- 函数模板func的声明
template <typename U, typename V> void func(U val1, V val2);
template <typename Z>
class Men
{
friend void func<int, int>(int, int); -- <int,int>是两个模板实参
-- friend void func<>(int, int); 这种写法也可以
-- friend void func<int>(int, int); 这种写法也可以
friend void func<float,int>(float, int);
--friend void func<>(float, int);
friend void func<int, float>(int, float);
-- friend void func<>(int, float);
private:
void funcmen() const
{
cout << "Men::funcmen被调用了" << endl;
}
};
template <typename U,typename V>
void func(U val1, V val2)
{
Men<int> mymen;
mymen.funcmen();
}
func(2, 3);
func<float>(4.6f, 5);
func<int, float>(4, 5.8f)
Men::funcmen被调用了
Men::funcmen被调用了
Men::funcmen被调用了
让函数模板func成为类模板Men的友元函数模板
-- Men类模板
template <typename Z>
class Men
{
-- 让函数模板func成为类模板Men的友元函数模板
template <typename U, typename V> friend void func(U val1, V val2);
private:
void funcmen() const
{
cout << "Men::funcmen被调用了" << endl;
}
};
template <typename U,typename V>
void func(U val1, V val2)
{
Men<int> mymen;
mymen.funcmen();
}
- 将func函数模板泛化版本声明为Men类模板的友元模板之后那么func函数模板的特化版本也会被看成是Men类模板的友元。
template <>
void func(int val1, double val2)
{
Men<int> mymen;
mymen.funcmen();
}
- 编译器会把全特化的func函数模板看待成一个实例化过的函数模板。
在类模板中定义友元函数
- 这种友元函数是能够被调用的而且也只有在代码中调用了函数的时候编译器才会实例化出这个函数。
- 之所以这样定义友元函数一般都是因为在该友元函数中会 用到这个类模板的成员。
- 这种友元函数的调用与调用普通函数函数就把他当成普通函数来看待即可。
template <typename Z>
class Men
{
friend void func2(Men<Z>& tmpmen)
{
tmpmen.funcmen();
}
private:
void funcmen() const
{
cout << "Men::funcmen被调用了" << endl;
}
};
Men<double> mymen2;
func2(mymen2); -- 直接调用Men类模板中定义的友元函数func2
Men<int> mymen3;
func2(mymen3);
- func2在Men类模板被实例化时并不会被一并实例化出来只有调用了func2的时候才会被实例化出来。
- 因为func2在类模板Men中所以调用func2时如果func2中的代码特别简单则func2会被当成内联函数来处理
- 如果func2中的代码比较复杂比如出现了for循环那么func2很可能就不会被当做内联函数来处理。
template <typename Z>
class Men
{
friend void func2(Men<Z>& tmpmen)
{
for(int i= 0; i<1 ; ++i)
tmpmen.funcmen();
}
private:
void funcmen() const
{
cout << "Men::funcmen被调用了" << endl;
}
};
- func2(mymen2); 可以被实例化出 void func2(class Men&);
- func2(mymen3); 可以被实例化出 void func2(class Men&);
out << “Men::funcmen被调用了” << endl;
}
};
- func2(mymen2); 可以被实例化出 void func2(class Men<double>&);
- func2(mymen3); 可以被实例化出 void func2(class Men<int>&);
- func2**其实是个全局函数。**