加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

boost-preprocessor – Boost-pp:如何确定宏参数是否为元组

发布时间:2020-12-16 07:08:57 所属栏目:百科 来源:网络整理
导读:元组是由逗号括起来的逗号分隔列表,例如 ()(,)(thing,)(2,3) 如果我有 #define ISTUPLE(x) ... 我喜欢ISTUPLE(nope)解析为0和ISTUPLE((是))以解析为1. [FWIW,我有足够的_RTFM_’d.] 解决方法 它可能在预处理库中完成,只需要做一些工作,但Variadic宏数据库(
元组是由逗号括起来的逗号分隔列表,例如

()
(,)
(thing,)
(2,3)

如果我有

#define ISTUPLE(x) ...

我喜欢ISTUPLE(nope)解析为0和ISTUPLE((是))以解析为1.

[FWIW,我有足够的_RTFM_’d.]

解决方法

它可能在预处理库中完成,只需要做一些工作,但Variadic宏数据库(自发布此问题后添加到Boost)有一个现成的解决方案.在boost / vmd / is_tuple.hpp中定义的 BOOST_VMD_IS_TUPLE应该可以满足您的需求:

#include <iostream>

#include <boost/vmd/is_tuple.hpp>

#if BOOST_VMD_IS_TUPLE() != 0
  #error BOOST_VMD_IS_TUPLE() != 0
#endif

#if BOOST_VMD_IS_TUPLE(nope) != 0
  #error BOOST_VMD_IS_TUPLE(nope) != 0
#endif

#if BOOST_VMD_IS_TUPLE((yep)) != 1
  #error BOOST_VMD_IS_TUPLE((yep)) != 1
#endif

#if BOOST_VMD_IS_TUPLE(()) != 1
  #error BOOST_VMD_IS_TUPLE(()) != 1
#endif

#if BOOST_VMD_IS_TUPLE((,)) != 1
  #error BOOST_VMD_IS_TUPLE((,)) != 1
#endif

#if BOOST_VMD_IS_TUPLE((thing,)) != 1
  #error BOOST_VMD_IS_TUPLE((thing,)) != 1
#endif

#if BOOST_VMD_IS_TUPLE((2,3)) != 1
  #error BOOST_VMD_IS_TUPLE((2,3)) != 1
#endif

static_assert(BOOST_VMD_IS_TUPLE() == 0,"BOOST_VMD_IS_TUPLE() != 0");
static_assert(BOOST_VMD_IS_TUPLE(nope) == 0,"BOOST_VMD_IS_TUPLE(nope) != 0");
static_assert(BOOST_VMD_IS_TUPLE((yep)) == 1,"BOOST_VMD_IS_TUPLE((yep)) != 1");
static_assert(BOOST_VMD_IS_TUPLE(()) == 1,"BOOST_VMD_IS_TUPLE(()) != 1");
static_assert(BOOST_VMD_IS_TUPLE((,)) == 1,"BOOST_VMD_IS_TUPLE((,)) != 1");
static_assert(BOOST_VMD_IS_TUPLE((thing,"BOOST_VMD_IS_TUPLE((thing,)) != 1");
static_assert(BOOST_VMD_IS_TUPLE((2,3)) == 1,"BOOST_VMD_IS_TUPLE((2,3)) != 1");

int main(void)
{
    using std::cout;
    using std::endl;
    cout << "BOOST_VMD_IS_TUPLE() == " << BOOST_VMD_IS_TUPLE() << endl;
    cout << "BOOST_VMD_IS_TUPLE(nope) == " << BOOST_VMD_IS_TUPLE(nope) << endl;
    cout << "BOOST_VMD_IS_TUPLE((yep)) == " << BOOST_VMD_IS_TUPLE((yep)) << endl;
    cout << "BOOST_VMD_IS_TUPLE(()) == " << BOOST_VMD_IS_TUPLE(()) << endl;
    cout << "BOOST_VMD_IS_TUPLE((,)) == " << BOOST_VMD_IS_TUPLE((,)) << endl;
    cout << "BOOST_VMD_IS_TUPLE((thing,)) == " << BOOST_VMD_IS_TUPLE((thing,)) << endl;
    cout << "BOOST_VMD_IS_TUPLE((2,3)) == " << BOOST_VMD_IS_TUPLE((2,3)) << endl;

    return 0;
}

输出:

BOOST_VMD_IS_TUPLE() == 0
BOOST_VMD_IS_TUPLE(nope) == 0
BOOST_VMD_IS_TUPLE((yep)) == 1
BOOST_VMD_IS_TUPLE(()) == 1
BOOST_VMD_IS_TUPLE((,)) == 1
BOOST_VMD_IS_TUPLE((thing,)) == 1
BOOST_VMD_IS_TUPLE((2,3)) == 1

(http://coliru.stacked-crooked.com/a/6e41eaf17437c5d5)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读