使用模版类作为模版参数

#include <iostream>
 
//-------------------
 
namespace trait {
    //通用模版
    template <typename T>
    struct type_init{};
 
     //实例化int模版
    template <>
    struct type_init<int> {
 
        enum {
            value = 0
        };
    };
     
     //实例化unsigned int模版
    template <>
    struct type_init<unsigned int> {
 
        enum {
            value = 0
        };
    };
 
     //实例化char模版
    template <>
    struct type_init<char> {
 
        enum {
            value = 0
        };
    };
 
     //实例化unsigned char模版
    template <>
    struct type_init<unsigned char> {
 
        enum {
            value = 0
        };
    };
     
     //通用模版
    template <class T>
    struct type_addition {
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef const T* const_pointer;
        typedef const T& const_reference;
        //std::cout << "normal template ! T=" << typeid(T).name()<< std::endl;
        //printf("normal template ! T=%s\n", typeid(T).name());
    };
 
     //实例化void模版
    template <>
    struct type_addition<void> {
        typedef void value_type;
        typedef void* pointer;
        typedef const void* const_pointer;
        //std::cout << "void template ! T=void" << std::endl;
        //printf("void template !\n");
    };

    //实例化int模版
    template <>
    struct type_addition<int> {
        typedef int value_type;
        typedef int* pointer;
        typedef int& reference;
        typedef const int* const_pointer;
        typedef const int& const_reference;
       
    };
 
     //实例化T*模版
    template <class T>
    struct type_addition<T*> {
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef const T* const_pointer;
        typedef const T& const_reference;
        //cout << "T* template ! T=" << typeid(T).name()<< endl;
        //printf("T* template ! T= %s\n", typeid(T).name());
    };
     
     //实例化T&模版
    template <class T>
    struct type_addition<T&> {
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef const T* const_pointer;
        typedef const T& const_reference;
        //cout << "T& template ! T=" << typeid(T).name()<< endl;
        //printf("T& template ! T= %s\n", typeid(T).name());
    };
 
     //实例化const T*模版
    template <class T>
    struct type_addition<const T*> {
        typedef T value_type;
        typedef T* pointer;
        typedef T& reference;
        typedef const T* const_pointer;
        typedef const T& const_reference;
        //cout << "const T* template ! T=" << typeid(T).name()<< endl;
        //printf("const T* template ! T= %s\n", typeid(T).name());
    };
 
}
 
//-------------------
 
/**定义模版类*/
template <typename T, typename E>
class Node {
public:
 
    void sayHello(void) {        
        std::cout << "hello ! T=" << typeid(T).name()<<" E=" << typeid(E).name()<< std::endl;
    }
};
 
/**特化模版类 int*/
template <>
class Node<int, int> {
public:
 
    void sayHello(void) {
        std::cout << "hello <int, int> !" << std::endl;;
    }
};

/**特化模版类 char*/
template <>
class Node<int, char> {
public:
 
    void sayHello(void) {
        std::cout << "hello <int, char> !" << std::endl;;
    }
};

/**特化模版类 void*/
template <>
class Node<int, void> {
public:
 
    void sayHello(void) {
        std::cout << "hello <int, void> !" << std::endl;;
    }
};
 
/**创建模版类,其中模版的参数N也是一个模版类,且默认为Node<typanem T,typename E> 的模版*/
template <typename T,
        template<typename, typename> class N = Node /* 重点! */ >
class NodeOperator {

public:

/*
    *    这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,
    *    这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
    */

    //typedef typename trait::type_addition<T>::value_type value_type_n;    //---实例化int模版        typename 不可以省略

    typedef typename trait::type_addition<int>::value_type value_type_n;  //---实例化int模版  typename 可以省略

    typedef typename trait::type_addition<void>::value_type value_type_v;   //---实例化void模版

    typedef typename trait::type_addition<char>::value_type value_type_c;      //---通用模版
    typedef typename trait::type_addition<char*>::value_type value_type_pc;                //---实例化T*模版
    typedef typename trait::type_addition<char&>::value_type value_type_rc;                //---实例化T&模版
    typedef typename trait::type_addition<const char*>::value_type value_type_cpc;        //---实例化const T*模版
    typedef N<T, value_type_n> node_type_n; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */
    typedef N<T, value_type_v> node_type_v; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */
    typedef N<T, value_type_c> node_type_c; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */
    typedef N<T, value_type_pc> node_type_pc; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */
    typedef N<T, value_type_rc> node_type_rc; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */
    typedef N<T, value_type_cpc> node_type_cpc; /** 模版类参数的完全特化,其参数可使用外部模版类的参数 */

    //node_type_n node;
    //node_type_v node;
    node_type_c node;
    // node_type_pc node;
    // node_type_rc node;
    // node_type_cpc node;
};
 
/*
 *
 */
//
//程序入口点。
//
int main()
{

    NodeOperator<char> no1;
    no1.node.sayHello();
 
    NodeOperator<int> no2;
    no2.node.sayHello();

    return 0;

}


结果:

hello ! T=c E=v
hello ! T=i E=v
huyf@ubuntu:~/test$ g++ t1.cpp t2.cpp -o t12
huyf@ubuntu:~/test$ ./t12
hello ! T=c E=i
hello int !
huyf@ubuntu:~/test$ g++ t1.cpp t2.cpp -o t12
huyf@ubuntu:~/test$ ./t12
hello ! T=c E=v
hello ! T=i E=v
huyf@ubuntu:~/test$ g++ t1.cpp t2.cpp -o t12
huyf@ubuntu:~/test$ ./t12
hello ! T=c E=c
hello <int, char> !
huyf@ubuntu:~/test$


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值