首页 > 其他分享 >cpp constexpr 类名推断(gcc需要7.3以上

cpp constexpr 类名推断(gcc需要7.3以上

时间:2022-11-25 13:57:41浏览次数:38  
标签:__ gcc TypeName constexpr rv 7.3 intern fullname size




#include <iostream>
#include <string_view>

template<typename T>
struct TypeName {
    constexpr static std::string_view fullname_intern() {
        #if defined(__clang__) || defined(__GNUC__)
            return __PRETTY_FUNCTION__;
        #elif defined(_MSC_VER)
            return __FUNCSIG__;
        #else
            #error "Unsupported compiler"
        #endif
    }
    constexpr static std::string_view name() {
        size_t prefix_len = TypeName<void>::fullname_intern().find("void");
        size_t multiple   = TypeName<void>::fullname_intern().size() - TypeName<int>::fullname_intern().size();
        size_t dummy_len  = TypeName<void>::fullname_intern().size() - 4*multiple;
        size_t target_len = (fullname_intern().size() - dummy_len)/multiple;
        std::string_view rv = fullname_intern().substr(prefix_len, target_len);
        if (rv.rfind(' ') == rv.npos)
            return rv;
        return rv.substr(rv.rfind(' ')+1);
    }

    using type = T;
    constexpr static std::string_view value = name();
};

namespace s1 {
    
    class MyClass;
}

int main()
{


   static_assert(TypeName<s1::MyClass>::value == "s1::MyClass");
    std::cout<<"FULLNAME void> "<<TypeName<void>::fullname_intern()<<std::endl;
    std::cout<<"FULLNAME int> "<<TypeName<int>::fullname_intern()<<std::endl;
    std::cout<<"TYPETEST> '"<<TypeName<s1::MyClass>::value<<"' == 's1::MyClass'"<<std::endl;
    return 0;

}

标签:__,gcc,TypeName,constexpr,rv,7.3,intern,fullname,size
From: https://www.cnblogs.com/nocanstillbb/p/16924882.html

相关文章

  • 错误 CS1617 Invalid option '7.3' for /langversion; must be ISO-1, ISO-2, Default
    一年前的程序版本拉下来需要改动下,突然生成程序报这个错。解决方法,网上说修改项目属性-生成-高级,语言版本选择default。我这个项目就不能修改,后来查了下https://stac......
  • gcc_预处理_编译_汇编_连接
    +------------------+|gcc-E||----------------->||---------------------------------+|gcc......
  • arm-linux-gcc把char定义为 unsigned char
    目录三者的关系char的定义参考文章三者的关系ANSIC提供了3种字符类型,分别是char、signedchar、unsignedchar。而不是像short、int一样只有两种(int默认就是unsigned......
  • gcc/g++ 编译器入门(1)
    GCC全称是GNUCompiler Collection 意思是gnu编译器合集也就是说GCC包括了各种语言的编译器比如c编译器c++编译器 java编译器Fortran编译器go编译器等等我们这......
  • mipsel-linux-gcc 安装,opt/buildroot-gcc342/bin/mipsel-linux-gcc解决办法
    1.Commandnotfound错误的确认用mipsel-Linux-uclibc-gcc编译Uboot时,出现Commandnotfound错误,但是我检查了编译工具的路径等是正确的,之后在编译工具目录直接运行mips......
  • 17.3 给内存映射文件指定基地址--《Windows核心编程》
    可以使用MapViewOfFileEx函数,建议系统把文件映射到指定的地址。其他参数与MapViewOfFile相同,最后一个参数pvBaseeAddress指定目标地址。同VirtualAlloc,指定的地址......
  • risc-v gcc 编译 atomic 指令时产生 illegal operands 错误的解决办法
    错误的写法:amoadd.wa1,a0,a2这是参照OpenRISC-VReferenceCard的格式书写的,这将将产生错误:illegaloperands`amoadd.wa1,a0,a2'正确的写法:amoadd.wa1,a2,(a0)凡......
  • gcc 好玩的 builtin 函数
    gcc好玩的builtin函数前言在本篇文章当中主要想给大家介绍一些在gcc编译器当中给我们提供的一些好玩的内嵌函数(builtinfunction)......
  • 【c&c++】gcc -l参数和-L参数
    -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头l......
  • gcc 9.3编译
    CentOS7升级GCC版本至9.31前言2开始2.1下载GCC69.3.0源码并解压2.2安装gcc所需依赖项2.3编译gcc源码2.4编译生成makefile文件,并安装2.5设置环境变量2.6设置头文件......