boost-preprocessor - 升压-pp : how to determine if a macro parameter is a tuple

标签 boost-preprocessor

元组是由括号括起来的逗号分隔列表,例如

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

如果我有
#define ISTUPLE(x) \\...

我想要类似 ISTUPLE(nope) 的东西解析为 0 和 ISTUPLE((yep))解决为 1。

[FWIW,我有_RTFM_'d很多。]

最佳答案

它可能会在预处理库中完成一些工作,但可变宏数据库(自发布此问题后添加到 Boost)有一个现成的解决方案。 BOOST_VMD_IS_TUPLE ,在 boost/vmd/is_tuple.hpp 中定义,应该做你正在寻找的:

#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,)) == 1,"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 )

关于boost-preprocessor - 升压-pp : how to determine if a macro parameter is a tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23997307/

相关文章:

c++ - 如何创建代理类?

c-preprocessor - C99 预处理器图灵完整吗?

c++ - 如何生成用于连接字符串的可变参数宏

c++ - Boost 预处理器程序在从 Boost 1.55 更改为 1.57 后无法编译

c++ - BOOST_PP_VARIADIC_SIZE 未扩展

c - 将 BOOST_PP_DEC 传递给另一个宏

c++ - 基于Boost foreach实现enumerate_foreach

c++ - 如何在 BOOST_PP_IF 中扩展包含逗号的宏

c++ - 如何迭代 Boost Multi_index 容器的索引?

c++ - 通过将参数转换为字符串文字来生成样板代码