使用 std::conditional_t 延迟评估(短路)的通用方法

2024-05-15

在处理编译时字符串时(变量列表char)操作,我需要实现一种方法来检查编译时字符串是否包含另一个(较小的)编译时字符串。 这是我的第一次尝试:

template<int I1, int I2, typename, typename> struct Contains;

template<int I1, int I2, char... Cs1, char... Cs2> 
struct Contains<I1, I2, CharList<Cs1...>, CharList<Cs2...>>
{
    using L1 = CharList<Cs1...>;
    using L2 = CharList<Cs2...>;

    using Type = std::conditional_t
    <
        (I1 >= sizeof...(Cs1)),
        std::false_type,
        std::conditional
        <
            (L1::template at<I1>() != L2::template at<I2>()),
            typename Contains<I1 + 1, 0, L1, L2>::Type,
            std::conditional
            <
                (I2 == sizeof...(Cs2) - 1),
                std::true_type,
                typename Contains<I1 + 1, I2 + 1, L1, L2>::Type
            >
        >
    >;
};

我发现这个解决方案非常容易阅读和推理。很遗憾,它不起作用.

编译器总是尝试实例化每个分支std::conditional,甚至那些没有被采取的。换句话说,短路没有发生。 这导致Contains被无限实例化。

我通过分离每个来解决了我原来的问题std::conditional块在单独的模板类中,其中条件结果作为部分特化进行处理。 它有效,但不幸的是我发现它很难阅读/修改。


有没有办法延迟实例化模板类型并接近我原来的解决方案?

我想我可以将贪婪实例化的模板包装在如下类型中:

DeferInstantiation<typename Contains<I1 + 1, 0, L1, L2>::Type>

这应该可以防止模板参数的贪婪实例化。 是否有可能以某种方式实施DeferInstantiation<T>?


这是一个通用模板,允许通过简单地不实例化来延迟实例化:)

template <bool B, template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ArgsTuple>
struct LazyConditional;

template <template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ... Args>
struct LazyConditional<true, TrueTemplate, FalseTemplate, std::tuple<Args...>>
{
  using type = TrueTemplate<Args...>;
};

template <template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ... Args>
struct LazyConditional<false, TrueTemplate, FalseTemplate, std::tuple<Args...>>
{
  using type = FalseTemplate<Args...>;
};

为了完整起见,一个简单的例子演示了它的用法:

#include <iostream>
#include <type_traits>
#include <tuple>

template <typename T>
struct OneParam
{
  void foo(){std::cout << "OneParam" << std::endl;}
};

template <typename T, typename U>
struct TwoParam
{
  void foo(){std::cout << "TwoParam" << std::endl;}
};

template <bool B, template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ArgsTuple>
struct LazyConditional;

template <template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ... Args>
struct LazyConditional<true, TrueTemplate, FalseTemplate, std::tuple<Args...>>
{
  using type = TrueTemplate<Args...>;
};

template <template <typename...> class TrueTemplate, template <typename...> class FalseTemplate, typename ... Args>
struct LazyConditional<false, TrueTemplate, FalseTemplate, std::tuple<Args...>>
{
  using type = FalseTemplate<Args...>;
};

template <typename ... Args>
struct OneOrTwoParam
{
  using type = typename LazyConditional<sizeof...(Args)==1, OneParam, TwoParam, std::tuple<Args...> >::type;
};

int main()
{
  OneOrTwoParam<int>::type().foo();
  OneOrTwoParam<int, int>::type().foo();
  return 0;
}

这打印:

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

使用 std::conditional_t 延迟评估(短路)的通用方法 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 编码杂志[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • TensorFlow 相当于 PyTorch 的 Transforms.Normalize()

    我正在尝试推断最初在 PyTorch 中构建的 TFLite 模型 我一直在遵循PyTorch 实现 https github com leoxiaobin deep high resolution net pytorch blob 1ee
  • opc ua客户端到服务器

    我想知道是否可以将数据从 OPC UA 客户端发送到服务器 我有一台设置了 OPC UA 服务器的 Windows 10 PC 和一些 Raspberry Pi 作为客户端 我已经编写了 Python 代码来将数据从服务器发送到客户端 现在
  • C++,set_terminate 是每个线程本地的吗?

    Should set terminate get terminate在 C 2011 或 C 2003 中为多个线程设置不同的终止异常处理器 例如 如果我有程序并将终止处理程序设置为func 1 然后我启动3个线程 新线程中的终止处理程序是
  • PayPal 定期付款:如何添加初始付款。

    我一直在使用实现一个功能 可以使用 PayPal 进行定期付款 并发送此请求 复制自https developer paypal com webapps developer docs api create a plan https deve
  • 如何使 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?

    class LoginActivity AppCompatActivity private val firebaseAuth FirebaseAuth getInstance private val firebaseAuthListener
  • 读取混合(即文本和二进制)数据的最佳方法是什么?

    我需要能够读取混合二进制和非二进制数据的文件格式 假设我知道输入是好的 那么最好的方法是什么 作为示例 我们以一个文件为例 该文件的第一行是 double 换行符 0x0D 0x0A 后面是十个字节的二进制数据 当然 我可以计算换行符的位置
  • 如何查询集成服务目录

    问题 识别连接到 SQL Server 上特定数据库表的所有 SSIS 包 详细信息 服务器上部署了近 100 个包 大多数包的大小都很大 因此很难以高精度手动检查它们 有没有一种快速且自动化的方法来做到这一点 使用 SQL Server
  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 通过样式设置 DataGridCellsPresenter 的 ItemsPanel 不起作用

    我正在尝试设置ItemsPanel of a DataGridCellsPresenter在我的窗口的资源中 Bu
  • Docker 容器 - 如何配置使其在 vagrant 中运行时获得可行的 IP 地址?

    Docker www docker io 看起来棒极了 然而 安装 VirtualBox 后 Vagrant 最后是 Mac 上的 Docker 我发现无法从另一台计算机 或从 Mac 上的终端会话 访问 Docker 容器中运行的服务 我
  • 使用写!使用字符串而不是字符串文字的宏

    我写了以下函数 fn print error text str let mut t term stdout unwrap t fg term color RED unwrap write t text unwrap assert t res
  • 使用 Yarn 从 Gitlab 安装私有包

    我有一个私有 npm 包 它使用 Gitlab CI 管道发布到 Gitlab 包注册表 我想在项目中使用安装这个包yarn 遵循文档帮助我想出了以下内容 npmrc file gitlab com api v4 packages npm
  • iOS:将观察者添加到 UIView 的frame.origin.y?

    我正在尝试监视 UIView 框架原点的变化值并对其做出反应 我的代码 cell bottomView addObserver self forKeyPath frame origin options NSKeyValueObserving
  • 如何在 gnuplot 中绘制导入数据的函数?

    如果我有一个包含多个数据点的文件 我怎样才能绘制它们的函数 例如 假设我有一个 to columns 的文件x and y我想绘制sin y 作为一个函数1 x 尝试这个 plot u 1 1 sin 2 w l 2 00000 0 161
  • 使用自定义 mysql 模式的模块扩展 ejabberd?

    代替ejabberd sql https github com processone ejabberd blob master sql mysql sql L95 我正在使用自定义 MySQL 架构 由于遗留原因 我将对某些活动执行一些数据
  • 网络应用程序如何询问移动设备的位置?

    许多现代手机 谷歌Nexus等 都有某种内置的定位服务 当我访问某个网站 例如 google com 时 该网站会询问我是否愿意与该网站分享我的位置 您实际上如何要求移动设备向网站提供其位置 该位置以什么格式给出 我没有任何线索 也没有从谷
  • 尝试运行 Flask Web 应用程序时出现 null is not Defined 错误

    我正在尝试构建一个网络应用程序 它将清理 csv 并返回 pdf 格式的图表 因为我是构建网络应用程序和烧瓶的新手 我尝试从构建一个简单的 Web 应用程序开始 该应用程序允许用户上传 csv 格式的文件 但是 当我尝试在 bash 上运行
  • 使用 std::conditional_t 延迟评估(短路)的通用方法

    在处理编译时字符串时 变量列表char 操作 我需要实现一种方法来检查编译时字符串是否包含另一个 较小的 编译时字符串 这是我的第一次尝试 template