首页 > 编程语言 >C++——多层嵌套模板类的静态成员变量的声明与定义方式

C++——多层嵌套模板类的静态成员变量的声明与定义方式

时间:2022-11-29 13:35:43浏览次数:59  
标签:parent int void child upid C++ 嵌套 ucid 模板

在 C++ 类的设计中,静态成员变量必须在类中声明,在类外定义,对于模板类亦是如此。
如果只是单层级的模板类,其声明方式参考如下代码:

template< typename upid_t >
class parent_t
{
private:
    static upid_t ms_auto_upid; ///< 静态成员变量

public:
    parent_t(void) : { m_upid = ms_auto_upid++; }
    ~parent_t(void) { }

    upid_t id(void) { return m_upid; }

protected:
    upid_t m_upid;
};

/** 静态成员变量的外部定义 */
template< typename upid_t >
upid_t parent_t< upid_t >::::ms_auto_upid = upid_t(100);

而针对多层级内嵌的模板类,其 静态成员变量外部定义 方式,我在网上未能搜到相关代码的写法,好在自己通过多次尝试也摸索出正确的代码定义写法,如下所示:


#include <iostream>

template< typename upid_t >
class parent_t
{
public:
    template< typename ucid_t >
    class child_t
    {
    private:
        static ucid_t ms_auto_ucid; ///< 静态成员变量

    public:
        child_t(void)   { m_ucid = ++ms_auto_ucid; }
        ~child_t(void)  { }

        ucid_t id(void) { return m_ucid; }
    private:
        ucid_t m_ucid;
    };

public:
    parent_t(upid_t upid) : m_upid(upid) { }
    ~parent_t(void) { }

    upid_t id(void) { return m_upid; }

protected:
    upid_t m_upid;
};

/** 多层嵌套模板类的静态成员变量的定义方式 */
template< typename upid_t >
template< typename ucid_t >
ucid_t parent_t< upid_t >::child_t< ucid_t >::ms_auto_ucid = ucid_t(100);

int main(int argc, char * argv[])
{
    parent_t< unsigned int >::child_t< int > xchild1;
    parent_t< unsigned int >::child_t< int > xchild2;
    parent_t< unsigned int >::child_t< size_t > xchild3;
    parent_t< unsigned int >::child_t< size_t > xchild4;

    std::cout << "child 1 : " << xchild1.id() << std::endl;
    std::cout << "child 2 : " << xchild2.id() << std::endl;
    std::cout << "child 3 : " << xchild3.id() << std::endl;
    std::cout << "child 4 : " << xchild4.id() << std::endl;

    return 0;
}

利用 https://godbolt.org 提供的在线编译环境,上面测试代码在多种编译器下编译通过,其输出结果均符合预期结果,即:

child 1 : 101
child 2 : 102
child 3 : 101
child 4 : 102

标签:parent,int,void,child,upid,C++,嵌套,ucid,模板
From: https://www.cnblogs.com/Gaaagaa/p/16935149.html

相关文章

  • Discuz模板制作视频教程
    资源简介discuz的模板也是可以自己制作的,想让你的网站更好看,更适合你的论坛主题,那就来学习一下怎么做模板吧。discuz模板制作视频教程,只需要简单的9节课,就能轻松教会大家......
  • C++小蜜蜂
    #include<iostream>#include<string>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;voidbol(intx,inty,intz);voidemo(intx,inty,intz);voidwine......
  • C++如何做字符串分割(5种方法)
    C++如何做字符串分割(5种方法)卧_听风雨于 2021-04-0617:54:50 发布55916 收藏 163分类专栏: C++ 文章标签: C++ 字符串分割版权C++专栏收录该内......
  • C++多继承(多重继承)
    派生类都只有一个基类,称为单继承(SingleInheritance)。除此之外,C++也支持多继承(MultipleInheritance),即一个派生类可以有两个或多个基类。多继承容易让代码逻辑复杂、思路......
  • 高精度乘法模板(大*大)
    高精度乘法模板(大*大)#include<bits/stdc++.h>usingnamespacestd;vector<int>mul(vector<int>&A,vector<int>&B){ vector<int>C(A.size()+B.size()+7,......
  • 在Unity中使用C#调用C++动态链接库(DLL)
     在Unity中使用C#调用C++动态链接库(DLL)https://blog.csdn.net/qq_51456342/article/details/125693678 [FNote: 属性页中无C++项时,要先写点代码编译一下,就有了]......
  • 处理iframe中嵌套本页面的问题
    在框架中,常常会出现一种状况,当session失效之后再次操作时,会发现登录页面(或者你要操作的页面)突然见就显示在了iframe中,这是很不好的体验。出现的效果大致像这样:......
  • c++_makefile
    关于四个version的思考,既然makefile的使用是为了便捷,从刚开始第一个简版的makefile有什么用,到第二版可以用依赖来抽象出1$(TARGET)和$(OBJ)之间的关系2.o.cpp之间的关......
  • Swift 2023:强调并发、泛型和 C++ 互操作性,开发 Swift 解析器
    AppleSwift团队的一名工程师兼语言工作组成员JohnMcCall在最新发布的一篇博客中介绍了Swift的2023年度计划。“Swift项目中有很多激动人心的工作正在进行,而且很......
  • C++学习------cmath头文件的源码学习06
    函数族定义---双曲函数cosh---计算双曲余弦函数sinh---计算双曲正弦函数tanh---计算双曲正切函数acosh---计算双曲余弦面积asinh---计算双曲正弦面积atanh---计算双曲正切面......