学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1168

主题
发表于 2022-8-4 12:15:26 | 查看: 2839| 回复: 0
需求:

让一个类型的变量只能定义一次,例如:
A a; // 有效
//////////////////////////////////////
增加一次定义,就会编译期报错,例如:
A a;
A b; // 编译期报错


解决:
#include <iostream>

template<class T> struct DeclGen {
    friend constexpr void A_CAN_ONLY_CONSTRUCT_ONCE(DeclGen);
};
template<class T, class V> struct DefiGen : DeclGen<T> {
    friend constexpr void A_CAN_ONLY_CONSTRUCT_ONCE(DeclGen<T>) { }
};

struct A
{
    template<auto L = [] {}> constexpr A()
    {
        A_CAN_ONLY_CONSTRUCT_ONCE(DefiGen<A, decltype(L)>());
    }
};

int main()
{
    A a;
    //A b;
}


根据以下语法规则:
  • 非类型模板参数可以使用lambda表达式,并且每个lambda表达式都拥有不同的匿名类型(尽管代码里面都是[]{})
  • 类模板内可以用友元注入的方式定义友元函数,从而为类外非模板函数提供定义
  • 非模板非inline函数只能有一个定义
因此通过构造函数的lambda非类型模板参数实例化不同的DefiGen类,它们都为A_CAN_ONLY_CONSTRUCT_ONCE函数提供定义,在第二次实例化时会爆出A_CAN_ONLY_CONSTRUCT_ONCE函数重复定义的错误




温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-11-23 16:22 , Processed in 0.121275 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表