c++(1) 类模板/构造函数/捕获异常 实例

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函数只有四个输入,但是我们看它函数体内部,其实还是指向有五个输入的那个函数,并写了一个捕获异常

猜你喜欢

转载自blog.csdn.net/u013608336/article/details/78067518