template拾遗

关于模板与友元

  • 类模板的友元
    • 一般上, 此类是所有实例的友元类
    • 常用形式是, 模板参数作为这个实例友元类
  • 类模板的友元函数
    • 一般上, 此函数是所有实例的友元函数
  • 类模板的友元类模板
    • 重新使用一系列模板参数 => 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;
}