title: c++(1) 类模板/构造函数/捕获异常 实例
tag: cpp
在一个头文件里,一般上面写模板类的声明,下面写模板类的定义
一、类模板
1.模板类的声明
template<typename TDatums,
typename TWorker = std::shared_ptr<Worker<std::shared_ptr<TDatums>>>,
typename TQueue = Queue<std::shared_ptr<TDatums>>>
class Wrapper
2.模板类的使用
这里有三种形式参数,调用的时候传入任何一种参数即可。创建了一个类的对象,opWapper。
op::Wrapper<std::vector<op::Datum>> opWrapper;
std::vector<op::Datum>
应该属于第一种形参
3.模板函数的定义
代码中有一行调用了configue这个函数。
configure为名定义的同名函数就有四个,这四个所传入的参数个数,类型不同,因此可以重名。
opWrapper.configure(wrapperStructPose, wrapperStructFace, wrapperStructHand, wrapperStructInput, wrapperStructOutput);
二、构造函数
1.声明
explicit Wrapper(const ThreadManagerMode threadManagerMode = ThreadManagerMode::Synchronous);
2.定义
构造函数用冒号初始化一些变量
template<typename TDatums, typename TWorker, typename TQueue>
Wrapper<TDatums, TWorker, TQueue>::Wrapper(const ThreadManagerMode threadManagerMode) :
mThreadManagerMode{threadManagerMode},
spVideoSeek{std::make_shared<std::pair<std::atomic<bool>, std::atomic<int>>>()},
mThreadManager{threadManagerMode},
mMultiThreadEnabled{true}
{
try
{
// It cannot be directly included in the constructor, otherwise compiler error for copying std::atomic
spVideoSeek->first = false;
spVideoSeek->second = 0;
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
3.析构函数
定义
template<typename TDatums, typename TWorker, typename TQueue>
Wrapper<TDatums, TWorker, TQueue>::~Wrapper()
{函数体}
一般的函数定义
template<typename TDatums, typename TWorker, typename TQueue>
void Wrapper<TDatums, TWorker, TQueue>::disableMultiThreading()
{函数体}
在类模板中,所以函数定义的时候都要加上
template<typename TDatums, typename TWorker, typename TQueue>
模板关键字
和Wrapper<TDatums, TWorker, TQueue>::
类名
三、捕获异常
try…catch 语句将能引发错误的代码放在try块中,并且对应一个响应,然后有异常被抛出。
template<typename TDatums, typename TWorker, typename TQueue>
void Wrapper<TDatums, TWorker, TQueue>::configure(const WrapperStructPose& wrapperStructPose, const WrapperStructFace& wrapperStructFace, const WrapperStructInput& wrapperStructInput,const WrapperStructOutput&wrapperStructOutput)
{
try
{
configure(wrapperStructPose, wrapperStructFace, WrapperStructHand{},
wrapperStructInput, wrapperStructOutput);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
这个configure函数只有四个输入,但是我们看它函数体内部,其实还是指向有五个输入的那个函数,并写了一个捕获异常