首页 > 编程语言 >C++模板元编程 实测

C++模板元编程 实测

时间:2024-11-03 11:19:22浏览次数:5  
标签:struct 编程 value static C++ template 模板 特化

本文记录在各平台(g++、msvc)中实测《C++模板元编程实战:一个深度学习框架的初步实现》中代码的过程。

1.3.2节,作者给出了这一段代码:
`
template
struct Wrapper
{
template
struct Fun_
{
constexpr static size_t value = 0;
};

template <>
struct Fun_<int>
{
    constexpr static size_t value = 1;
};

};
作者表示:在非完全特化的类模板中引入完全特化的分支代码是非法的。经过实测,该段代码在MSVC中可以不报错,在g++中报错。原因是:在MSVC中,编译器允许在类作用域内进行显式模板特化,而这在标准C++中是不符合规范的。 要使之可以在g++中通过编译,可以修改为:
struct Wrapper
{
template
struct Fun_
{
constexpr static size_t value = 0;
};
};

template <>
struct Wrapper::Fun_
{
constexpr static size_t value = 1;
};
但是这要求Wrapper是一个普通类而非模板类,当Wrapper不能表示为普通类时,不能通过简单的办法通过编译,而必须使用书中后续给的代码:
template
struct Wrapper
{
TW value;

template <typename T, typename TDummy = void>
struct Fun_
{
    constexpr static size_t value = 0;
};

template <typename TDummy>
struct Fun_<int, TDummy>
{
    constexpr static size_t value = 1;
};

};
注意,我们不能使用
template
struct Fun_<int, TDummy>
{
constexpr static size_t value = 1;
};
否则报错:default template arguments may not be used in partial specializations(在部分特化中不能使用默认模板参数)。 这个写法依赖于模板特化的规则,但是不允许在部分特化中使用默认模板参数是有道理的,考虑:
template
struct A{

};

template
struct A<int, U>
{
U value;
};
对于A<int, double>`,特化选择陷入两难境地。直接禁止部分特化使用默认模板参数保持了一致性(可以认为部分特化的参数+默认参数优先级最高)。

标签:struct,编程,value,static,C++,template,模板,特化
From: https://www.cnblogs.com/arcueid-take-me-go/p/18523050

相关文章

  • C++面向对象三大特性之多态
    1.1多态的基本概念 继承性反映的是类与类之间的层次关系,多态性则是考虑这种层次关系以及类自身特定成员函数之间的关系来解决行为的再抽象问题。其实就是同一符号或者名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。多态分为两类1.静态多态:函数重载和运......
  • 论面向方面的编程技术及其应用(AOP)
    摘要随着软件系统的规模和复杂度不断增加,传统的面向过程编程和面向对象编程(OOP)在应对横切关注点(如日志记录、事务管理、安全性检查等)时显得力不从心。面向方面的编程(Aspect-OrientedProgramming,简称AOP)作为一种新的编程范式,通过将横切关注点与业务逻辑分离,提高了代码的可维护......
  • FPGA(现场可编程门阵列)的时序分析
    在FPGA(现场可编程门阵列)的时序分析中,tsu(建立时间)、th(保持时间)、tco(时钟到输出延时)、tpd(引脚到引脚延时)以及tcd(可能指的是信号在组合逻辑中的传输延时,尽管它在FPGA时序分析中不是一个标准的术语,但在此为全面解答而提及)是几个至关重要的参数。这些参数共同决定了FPGA电路的性......
  • 利用 D 编程语言实现文字识别程序
    在本篇文章中,我们将手动实现一个简单的文字识别程序,使用D编程语言。我们将通过分析图像中的像素数据,识别出其中的字符。尽管D是一种较少使用的编程语言,但它的高性能和简洁性使得我们能够高效地进行图像处理。环境准备首先,确保你已经安装了D编程语言的编译器和库。我们需要......
  • 算法妙妙屋-------1.递归的深邃回响:C++ 算法世界的优雅之旅
    前言:递归是一种在算法中广泛应用的思想,其主体思想是通过将复杂的问题分解为更简单的子问题来求解。具体而言,递归通常包括以下几个要素:基本情况(BaseCase):每个递归算法必须有一个或多个基本情况,用于定义何时停止递归。基本情况是问题的最小实例,直接返回结果,不再进行进一......
  • 强化学习算法——TPG算法(遗传编程GP算法)代码
    tpg算法是一个使用模块涌现和复用机制的遗传编程(GP)算法,该算法在一些强化学习问题上有着不错的表现,本文给出该算法的项目地址。unused_code_chunks.cpp调试代码,实际项目的运行中并没有使用。[]项目所属实验室地址:https://creativealgorithms.ca/tpg算法的项目代......
  • C++模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......