条件编译和非类型模板参数

2024-03-28

我无法理解非类型模板参数,并希望有人能够阐明这一点。

#include <iostream>

template<typename T, int a>
void f() {
  if (a == 1) {
    std::cout << "Hello\n";
  } else {
    T("hello");
  }
}

int main() {
  f<int, 1>;
}

当我编译这个时,我收到一条错误消息:

/tmp/conditional_templates.cc:13:12:   required from here
/tmp/conditional_templates.cc:8:5: error: cast from ‘const char*’ to ‘int’ loses precision [-fpermissive]
     T("hello");
     ^

但是,编译器不能检测到非类型参数“a”为 1,因此不会采用 else 分支吗?还是期望太高了?在这种情况下,我该如何完成这样的事情?


我不得不承认,老实说,我不明白这样做的根本原因,但它是你的代码。除了明显的错误(未能为函数调用提供括号)main(),以及警告(将字符地址转换为数据丢失int),关于条件包含的更大问题很重要。

如果您有如下代码:

if (something)
{
    do something
}

它显然必须编译,并且会not有条件地这样做。那something源自非类型模板参数没有区别。您需要将逻辑从函数内的 if 表达式中取出并放入模板扩展控制机制中。专业化就是这样一种技术,SFINAE http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error是另一个:

#include <iostream>
#include <iomanip>
#include <type_traits>
#include <cstdint>

static const char* something = "something";

template<class T, bool a>
typename std::enable_if<a>::type f()
{
    std::cout << __PRETTY_FUNCTION__ << '\n';
    std::cout << something << '\n';
}

template<class T, bool a>
typename std::enable_if<!a>::type f()
{
    std::cout << __PRETTY_FUNCTION__ << '\n';
    std::cout << std::hex << T(something) << '\n';
}

int main()
{
    f<int, true>();
    f<intptr_t, false>();
}

Output

typename std::enable_if<a>::type f() [T = int, a = true]
something
typename std::enable_if<!a>::type f() [T = long, a = false]
100001f18

您在每个项目中做什么取决于您。当然,您可以使用预处理器宏进行投注并完成大部分/所有这些工作,但是这有什么乐趣呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

条件编译和非类型模板参数 的相关文章

  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 展开 std::reference_wrapper 的成本

    Given include
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 在 Python 中使用 Nan 对图像进行高斯滤波

    根据 2D 坐标列表和第三个变量 速度 我创建了一个覆盖整个采样区域的 2D numpy 数组 我的目的是创建一个图像 其中每个像素包含位于其中的点的平均速度 之后用高斯滤波器过滤该图像 问题是该区域没有均匀采样 因此我有几个没有信息的像素
  • iOS:当应用程序因崩溃而退出时,是否有任何委托方法

    当我的应用程序因内存不足 内存泄漏等一般崩溃而崩溃时退出时 我想与我的服务器进行一些交互 我想知道 在这种情况下是否会调用任何委托方法 以便我可以在应用程序因任何崩溃而退出之前快速联系我的服务器 谢谢 正如您所解释的 您需要联系服务器 您可
  • C 中带有 const 的“私有”结构成员

    为了拥有干净的代码 使用一些 OO 概念可能很有用 即使在 C 中也是如此 我经常编写由一对 h 和 c 文件组成的模块 问题是模块的用户必须小心 因为 C 中不存在私有成员 使用 pimpl 习惯用法或抽象数据类型是可以的 但它添加了一些
  • Gitlab 管道 - 报告配置包含未知键:cobertura

    由于此错误 我无法运行 gitlab 管道 Invalid CI config YAML file jobs run tests artifacts reports config contains unknown keys cobertur
  • 如何在 iPhone 中获取时差

    我有 2 个包含时间值的数组 它们采用以下格式 mm ss 数百秒 我想获得数组中两个 lastObjects 之间的差异 NSDate 不起作用 因为最后一个值以百分之一秒为单位 一个问题 如果第二个日期比第一个日期大 它会给我一个负数
  • FlowDocument 强制分页(之前分页)

    我使用 C 创建 FlowDocument 并用表中的数据填充它 Example FlowDocument flowDoc new FlowDocument Table table1 new Table flowDoc Blocks Add
  • 从 JQuery 附加 Laravel Blade

    我正在尝试从 Laravel 附加 Blade 语法 但无法让浏览器理解 Blade 当我从 js 文件附加 Blade 语法时 它将代码输出到页面上 this is my code Current box append if errors
  • 是什么导致 System.Drawing.Printing.PrinterSettings.InstalledPrinters 抛出 Win32Exception“RPC 服务器不可用”?

    我正在开发一个应用程序 我允许用户在从应用程序打印表单时选择一台打印机用作他们的打印机 我正在使用 NET 2 0 在设置屏幕中 我调用 System Drawing Printing PrinterSettings InstalledPr
  • Android ListView:获取可见项的数据索引

    我有一个安卓ListView创建与SimpleAdapter里面的项目多于屏幕所能容纳的项目 滚动列表后 我需要获取列表中第一个可见项目在数据模型中的位置 基本上我想要一个像这样的函数 listView getChildAt 0 getPo
  • 使用javascript比较路径并获取两个文件之间的相对路径

    如何动态比较同一域中的两个路径并获取它们之间的相对路径 var path2 http site net test1 test2 img 1 jpg test example var path3 http site net test1 img
  • .NET 4.5 MethodInfo 序列化重大更改

    问题 一个对象 带有私有MethodInfo使用程序集 1 0 版本序列化的字段 不会使用该程序集的 1 1 版本 aSerializationException将被抛出 因为尚未找到所需的方法 发生了什么变化 我发现 NET 4 5中的序
  • python pyaudio 使用多处理

    我正在尝试从音频流中获取样本并将它们放入共享队列中 我有另一个进程从该队列中提取 当我运行时 我收到此错误 recording Traceback most recent call last File record py line 43 i
  • 消息队列 makefile 错误:未定义对“mq_open”的引用

    虽然我已经链接了 lrt在我的 Makefile 中 正如你在下面看到的 我仍然得到undefined reference to mq open 请帮忙 all get1 iserv1 get get1 c gcc Wall o get1
  • java.time.Period ,除以周期会给出错误的结果

    我尝试使用java time Period 结果和我手工计算的结果相差了三天 这里奇怪的是 当我将时间段分为两个时间段时 结果与我的手动计算相符 第二种方法就像我手动计算周期一样 我是否错过了什么 日历算术有标准方法或算法吗 使用的算法是什
  • “没有这样的文件或目录”但它存在

    我只想从命令行运行可执行文件 arm mingw32ce g 但随后我收到错误消息 bash arm mingw32ce g No such file or directory 我运行的是 Ubuntu Linux 10 10 ls l l
  • 如何使用python2.7获取公共IP?

    如何使用python2 7获取公共IP 不是私有IP 目前有几种选择 ip 42 pl jsonip com httpbin org ipify org 以下是您可以利用上述各项的具体方法 ip 42 pl from urllib2 imp
  • 如何用单引号(')替换撇号(')

    似乎有两种类型的撇号 我想知道这个字符之间的区别 和这个 第一个是从 Microsoft Word 复制的 我试图将其粘贴到文本区域 然后插入数据库 但它不起作用 它破坏了我的查询 所以我想用这个 替换它 请问我该如何实现这一点 我尝试过
  • 从 Visual Studio 2017 连接到适用于 Linux 的 Windows 子系统

    我希望从 VS2017 调试 Linux C 控制台应用程序 如以下教程所示 使用适用于 Linux 的 Windows 子系统从 Visual Studio 编写和调试 Linux C 应用程序 https www hanselman c
  • C++ 绘图包 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个关于 c 绘图包的问题 过去几年我一直在使用 python 和 matplotlib 现在我使用
  • 条件编译和非类型模板参数

    我无法理解非类型模板参数 并希望有人能够阐明这一点 include