《Effective C++》条款43

发布时间:2023年12月21日

学习处理模板化基类内的名称

我想实现这样的一种:

class A
{
	void test1();
	void test2();
};
class B
{
	void test1();
	void test2();
};
template<class T>
class sender
{
public:
	void runtest1()
	{
		T t;
		t.test1();
	}
	void runtest2()
	{
		T t;
		t.text2();
	}
};

但是我们有时候想标记是哪个类执行的函数,想做日志信息。所以可以这样:

template<class T>
class senderlog:public sender<T>
{
public:
	void test1log()
	{
		// log记录
		runtest1();
		// log记录
	}
};
// 但是不能通过编译

为什么不能通过编译??

因为编译器不知道它继承什么样的class。它继承的是sender<T>,但是其中的T是个模板参数,不到后来被具现化无法确切知道它是什么。或者说根本不知道它有没有sender函数。

详细点说,假设有个类,它只有一个函数:

class C
{
	void test1();
};

这个时候就需要一个特化版本:

template<>
class sender<C>
{
public:
	void runtest1()
	{
		C c;
		c.test1();
	}
};

解决上述报错的三种方法:

template<class T>
class senderlog:public sender<T>
{
public:
	void test1log()
	{
		// log记录
		this->runtest1();
		// log记录
	}
};
template<class T>
class senderlog:public sender<T>
{
public:
	using sender<T>::runtest1();
	void test1log()
	{
		// log记录
		runtest1();
		// log记录
	}
};
template<class T>
class senderlog:public sender<T>
{
public:
	void test1log()
	{
		// log记录
		sender<T>::runtest1();
		// log记录
	}
};

?

文章来源:https://blog.csdn.net/qq_64863535/article/details/135127085
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。