如何检查模板类型是否是变体类型的类型之一?

2023-12-27

考虑到变体类型和模板函数,如何检查模板类型是否是变体的类型之一?还有比下面更优雅的方式吗?

typedef boost::variant<Foo,Bar> Var;

template <typename T>
void f(const T& x)
{
  BOOST_STATIC_ASSERT(
       boost::is_same<T,Foo>::value
    || boost::is_same<T,Bar>::value
  );
}

Note :我使用 Boost 1.57 和 gcc 4.8.3。我不使用 C++11为了与旧的 gcc 版本兼容。


Use MPL:

#include <boost/variant/variant.hpp>
#include <boost/mpl/contains.hpp>

typedef boost::variant<Foo, Bar> Var;

template <typename T>
void f(const T& x)
{
    BOOST_STATIC_ASSERT(boost::mpl::contains<Var::types, T>::value);
}

DEMO http://coliru.stacked-crooked.com/a/310e43c81d2c5078

或手动迭代boost:::variant types:

#include <boost/variant/variant_fwd.hpp>
#include <boost/type_traits.hpp>

template <typename T, typename V>
struct variant_has_type;

template <typename T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)>
struct variant_has_type<T, boost::variant<T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> >
    : boost::true_type {};

template <typename T, typename U, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)>
struct variant_has_type<T, boost::variant<U, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> >
    : variant_has_type<T, boost::variant<BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts), void> > {};

template <typename T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)>
struct variant_has_type<T, boost::variant<void, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> >
    : boost::false_type {};

DEMO 2 http://coliru.stacked-crooked.com/a/964a3c31c5cafdbc

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

如何检查模板类型是否是变体类型的类型之一? 的相关文章

随机推荐

  • 如何在 AVSpeechUtterance 之后持续停止 AVAudioSession

    我想做的是允许我的应用程序使用AVSpeechSynthesizer当后台音频应用程序正在播放音频时 当我的应用程序正在说话时 我希望后台应用程序的音频 变暗 然后在我的应用程序结束说话后返回到原始音量 In my AudioFeedbac
  • 在 Keras 中导入 Attention 包会出现 ModuleNotFoundError: No module named 'attention'

    作为导入的一部分 我导入 AttentionLayer 包 如下所示 from attention import AttentionLayer 我收到以下错误 ModuleNotFoundError No module named atte
  • Windows 上 Ruby 出现 SSL 错误

    赢7x64 每当我尝试安装 gem 时 都会收到 SSL 错误 ERROR While executing gem Gem RemoteFetcher FetchError SSL connect returned 1 errno 0 st
  • 无法安装 npm 包 ||没有权限

    我在安装 PM2 时遇到以下错误 我也尝试在本地安装它 但似乎没有任何效果 请帮忙 命令 npm install pm2 g anil anil Desktop restapis npm install pm2 g npm WARN opt
  • 这是做什么的:git分支-f

    我正在尝试弄清楚如何正确使用此命令 我相信这是我想要将一个分支本质上创建到另一个分支的命令和标志 基本上删除一个分支并创建一个与另一个分支的文件同名的新分支 但我不确定 或者我的语法是否正确 如果我这样做 git branch f mast
  • PCA前后数据维度

    我正在尝试kaggle com 的数字识别器竞赛 http www kaggle com c digit recognizer使用 Python 和 scikit learn 从训练数据中删除标签后 我将 CSV 中的每一行添加到如下列表中
  • 测试 Twilio 的电话号码

    Twilio 是否有任何可用于模拟出站呼叫的 测试 电话号码 例如 我希望能够充分测试我的应用程序 为繁忙的呼叫 应答机 无序 无效号码等返回异步响应 就像我通常期望的那样 您可以使用一些号码来发送 SMS 消息 但这些号码都会返回简单 即
  • Android 活动二进制 XML 文件行:您必须提供layout_width 属性

    我已经读过它了 但它仍然在这里
  • 为什么增强 for 循环的局部变量必须是局部的? [复制]

    这个问题在这里已经有答案了 根据Java 语言规范 第 14 14 2 节 http docs oracle com javase specs jls se7 html jls 14 html jls 14 14 2 增强的变量for循环必
  • android中动画完成时获取对象的位置

    有没有办法在动画结束后找出我的动画 对象 的最终位置 假设我正在使用 TranslateAnimation 和 ScaleAnimation 以及 setFillAfter true 在 1 秒内对父位置为 0 0 20 20 的 Imag
  • 在 Visual Studio Code 中使用多个 Python 内核

    我正在尝试开始使用 Visual Studio Code 和 Don Jayamanne 的 Python Jupyter 扩展 我的系统上同时有 Python 3 5 和 3 6 内核 但我无法使它们对这些扩展都可见 VS Code 中仅
  • 将一些包从基本环境克隆到另一个环境

    我安装了蟒蛇 所以我已经安装了很多软件包 现在我创建了一个新的环境 几乎是空的 并开始向其安装一些特定的软件包 我这台机器上没有互联网 所以我需要将轮子或源文件复制到它 好的 它可以工作 但是当我在基本环境中已经有像 numpy 这样的包时
  • Swift:将不受约束的泛型类型转换为确认可解码的泛型类型

    情况 我有两个通用类 它们将从 api 和数据库获取数据 分别说 APIDataSource 和 DBDataSource 创建视图模型时 我将在视图模型中注入两个类中的任何一个 视图模型将使用该类来获取所需的数据 我希望视图模型与这两个类
  • 给div设置style='height:100%'是什么意思?

    SO上有很多与此相关的问题 但我扫描的都是针对详细的具体情况 我想知道的是 在概念层面上 这意味着什么 div style height 100 100 有多高 100 什么 EDIT 跟进问题 如果100 代表parent的高度 但是pa
  • scikit-learn 分类器的小批量训练,我提供小批量

    我有一个非常大的数据集 无法加载到内存中 我想使用这个数据集作为 scikit learn 分类器的训练集 例如LogisticRegression 是否有可能在我提供小批量的情况下对 scikit learn 分类器进行小批量训练 我相信
  • 如何获取某种类型的所有小部件?

    我有一个绝对面板以及不同的小部件 按钮 图像 标签等 是否可以获取特定类型的所有小部件的集合或数组或其他任何内容 例如图像 干得好 我们可以用iterator Iterator
  • 如何使用xsl打印百分位数

    我正在尝试使用 HTML 报告生成 99 jmeter results detail report 21 xsl文件 我可以使用以下代码打印 90
  • CSS 家谱与名称长度的对齐问题

    我从 CSS3 Family Tree 的实验性多父版本开始 http thecodeplayer com experiment css3 family tree 2 http thecodeplayer com experiment cs
  • C# 相当于 VB“模块”

    在 Visual Basic 中 您可以使用模块作为存储 松散 代码的位置 这些代码可以是可以从应用程序中的其他位置访问的方法和变量 而无需首先初始化某些内容 并且可以设置或更改变量状态 并将始终保持该值 我发现的最接近的是 C 中的静态方
  • 如何检查模板类型是否是变体类型的类型之一?

    考虑到变体类型和模板函数 如何检查模板类型是否是变体的类型之一 还有比下面更优雅的方式吗 typedef boost variant