木子剑
生命不熄,学习不止!

题外话,为什么我学习C++?主要原因看到是GUIlite是用C++写的,如果不会C++,无法很好的使用;

为什么我要 了解C++的template模板,因为我在学习scmRTOS,这也是用C++写的,使用大量的

C++命名空间和C++模板,如果你不学习的话,也无法很好的使用scmRTOS

 

话说template模板最大的思想,就是简化重复操作,只要我们定义好模板,C++编译器就可以帮我们写代码。

一般分为:函数模板类模板。用户基本上就是使用这俩种了。。

 

看了很多视频,网上的应例子,感觉C++真的很强大。

另外总结一下,实现函数重载方法:

1.  使用虚函数,

2.  定义不同的命名空间,

3.  使用模板功能,

 

函数重载其实就是人们常提及的多态功能;C++中最重要的是概念,思想,语意,然后才到我们实际写的代码。

比如,模块就是为了简化工作,让C++自动为我们写代码。。。。

 

时间:2021-10-30

测试函数模板,如下所示:

#include <iostream>
#define log(x) std::cout<<x<<std::endl
using namespace std;

/* C++模板 */
template<class T>
T subt(T x, T y)
{
    T res;
    res = x + y;
    return res;
}

/* 测试mian */
int main(void)
{
   log(subt(2, 3));
   log(subt(2.5, 3.3));    
   return 0;
}  

执行结果:

  从执行结果可以看到,编译器自动帮我们写好了代码。

  

测试类的模板,如下所示:

#include <iostream>
#define log(x) std::cout<<x<<std::endl
using namespace std;

/* C++模板2 */
template<class T>
class YourClassName {
        T res;    // 数据
        
public:
        T subt(T x, T y) // 操作功能
        {
            res = x + y;
            return res;
        }
};


/* 测试mian */
int main(void)
{
   YourClassName<float> ooj;  // 实例化一个对像;
   YourClassName<int> ooj1;   // 实例化一个对像;
   
   log(ooj.subt(3.1, 3.6));   // 使用对像的成员函数
   log(ooj1.subt(3.1, 3.6));
   
   return 0;
}  
  

执行如下:

  

最后放一段OS里面例子:

    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    //
    //   process
    //
    //   Implements template for application processes instantiation
    //
    //      DESCRIPTION:
    //
    //
    #if SEPARATE_RETURN_STACK == 0

        template<TPriority pr, size_t stack_size>
        class process : public TBaseProcess
        {
        public:
            INLINE_PROCESS_CTOR process();

            OS_PROCESS static void exec();

        #if scmRTOS_PROCESS_RESTART_ENABLE == 1
            INLINE void terminate();
        #endif


        private:
            stack_item_t Stack[stack_size/sizeof(stack_item_t)];
        };

        template<TPriority pr, size_t stack_size>
        OS::process<pr, stack_size>::process() : TBaseProcess( &Stack[stack_size/sizeof(stack_item_t)]
                                                             , pr
                                                             , reinterpret_cast<void (*)()>(exec)
                                                         #if scmRTOS_DEBUG_ENABLE == 1
                                                             , Stack
                                                         #endif
                                                             )
        {
        }

        #if scmRTOS_PROCESS_RESTART_ENABLE == 1
        template<TPriority pr, size_t stack_size>
        void OS::process<pr, stack_size>::terminate()
        {
            TCritSect cs;

            reset_controls();
            init_stack_frame( &Stack[stack_size/sizeof(stack_item_t)]
                              , reinterpret_cast<void (*)()>(exec)
                          #if scmRTOS_DEBUG_ENABLE == 1
                              , Stack
                          #endif
                            );
        }
        #endif // scmRTOS_RESTART_ENABLE

        typedef OS::process<OS::prIDLE, scmRTOS_IDLE_PROCESS_STACK_SIZE> TIdleProc;

    #else  // SEPARATE_RETURN_STACK

        template<TPriority pr, size_t stack_size, size_t rstack_size>
        class process : public TBaseProcess
        {
        public:
            INLINE_PROCESS_CTOR process();

            OS_PROCESS static void exec();

        #if scmRTOS_PROCESS_RESTART_ENABLE == 1
            INLINE void terminate();
        #endif

        private:
            stack_item_t Stack [stack_size/sizeof(stack_item_t)];
            stack_item_t RStack[rstack_size/sizeof(stack_item_t)];
        };

        template<TPriority pr, size_t stack_size, size_t rstack_size>
        process<pr, stack_size, rstack_size>::process() : TBaseProcess( &Stack[stack_size/sizeof(stack_item_t)]
                                                                      , &RStack[rstack_size/sizeof(stack_item_t)]
                                                                      , pr
                                                                      , reinterpret_cast<void (*)()>(exec)
                                                                 #if scmRTOS_DEBUG_ENABLE == 1
                                                                      , Stack
                                                                      , RStack
                                                                 #endif
                                                                      )
        {
        }

        #if scmRTOS_PROCESS_RESTART_ENABLE == 1
        template<TPriority pr, size_t stack_size, size_t rstack_size>
        void OS::process<pr, stack_size, rstack_size>::terminate()
        {
            TCritSect cs;

            reset_controls();
            init_stack_frame( &Stack[stack_size/sizeof(stack_item_t)]
                            , &RStack[rstack_size/sizeof(stack_item_t)]
                            , reinterpret_cast<void (*)()>(exec)
                        #if scmRTOS_DEBUG_ENABLE == 1
                            , Stack
                            , RStack
                        #endif
                            );
        }
        #endif // scmRTOS_RESTART_ENABLE

        typedef OS::process< OS::prIDLE
                           , scmRTOS_IDLE_PROCESS_DATA_STACK_SIZE
                           , scmRTOS_IDLE_PROCESS_RETURN_STACK_SIZE> TIdleProc;

    #endif    // SEPARATE_RETURN_STACK
    //--------------------------------------------------------------------------

使用的时候像这样:

//---------------------------------------------------------------------------
//
//      Process objects   申明一个对像
//
OS::process<OS::pr0, 400> Proc1;



//---------------------------------------------------------------------------
template<> OS_PROCESS void OS::process<OS::pr0, 400>::exec()
{
    for(;;)
    {
        //--------------------------------------------------
        //
        //            Message test
        //
        //
        //     Receive data as message
        //
        MamontMsg.wait();          // wait for message
        MamontMsg.out(Mamont);     // read message content to global test object
        if(Mamont.src == TMamont::PROC_SRC)
        {
            ; // Make some actions
        }
        else
        {
            ; // Make some actions
        }
    }
}
Proc1是一个对像,而这个template<> OS_PROCESS void OS::process<OS::pr0, 400>::exec()
是类的成员函数;


哎,有点乱了,template<> OS_PROCESS void Proc1::exec()不好一点吗?
不行的,回顾下知识点,所有的类有成员数据和成员函数,一般数据私有,函数可以供外设调用;
而Proc1是由类实例化的对像。
posted on 2021-10-29 08:51  木子剑  阅读(107)  评论(0编辑  收藏  举报