关于模板与友元
- 类模板的友元类
- 一般上, 此类是所有实例的友元类
- 常用形式是,
模板参数
作为这个实例
的友元类
- 类模板的友元函数
- 一般上, 此函数是所有实例的友元函数
- 类模板的友元类模板
- 重新使用一系列模板参数 => trival
- 关于能否使用外部类模板的参数做特例化/偏特化声明
template <>/减少个数
=> 作用域不同不允许特化声明 - 使用和外部一样的模板参数, 或部分参数 => appro one to one 友元
template <typename T>
void ft(T&& t);
template <typename L>
class Goo;
template <typename T, typename S>
struct Foo {
private:
friend void ft<T>(T&& t);
friend class Goo<T>;
// 实际上是指定若干实例而已, 绝对不是特化声明
};
- 类模板的友元函数模板
- 重新使用一系列模板参数 => trival
- 特例化声明
template<>
=> 同上 - 使用和外部一样的模板参数, 或部分参数 => appro one to one 友元
类的友元模板
- 类模板类似继承式的操作, 将类作为模板参数
- 函数模板, 类似成员模板, 无特殊语法
禅
- 模板T, FT, CT声明/特化声明一定有模板前缀的出现, 否则 => one-to-one 友元
- why 友元新语法 => 友元类的区分, 成员函数的区分 trival
- 模板T, FT, CT使用一定有
<>
的出现, 否则 => T default, 推导, 类内, 定死
other
- 类模板仅仅成员特例化, 不是整个实例, 此时只有类模板的花括号外声明语法
- 类模板特例化时的一部分而已
- 类模板仅仅成员偏特化, 不是整个偏特化实例, 是不存在的
- 此时要先有类模板的偏特化声明的花括号内语法, 才有成员偏特化花括号外语法
- 为什么不存在 =>
::
前的模板参数部分确定时, 要看到花括号声明语法
- 特例化, 成员特例化后, 将不能在交集内部分特例化/偏特化 => trival 成员定死了
template <typename T>
void ft(T&& t);
template <typename L>
class Goo;
template <typename T, typename S>
struct Foo {
private:
friend void ft<T>(T&& t);
friend class Goo<T>;
public:
void foo1()
{
}
void foo2()
{
}
};
template <>
void Foo<int, float>::foo1()
{
cout << "member specialization only" << endl;
}
template <typename S>
struct Foo<long, S> {
public:
void foo1()
{
}
void foo2();
};
template <typename S>
void Foo<long, S>::foo2()
{
cout << "member partial specialization only" << endl;
}
template <typename L>
class Goo {
public:
virtual ~Goo();
};
template <typename T>
void ft(T&& t)
{
std::cout << typeid(t).name() << std::endl;
}
int main()
{
Foo<int, float> f;
f.foo1();
Foo<long, float> f2;
f2.foo2();
return 0;
}
PREVIOUSJavaLambda