Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost预处理器进行令牌比较_C++_Boost_Macros_Boost Preprocessor - Fatal编程技术网

C++ 使用boost预处理器进行令牌比较

C++ 使用boost预处理器进行令牌比较,c++,boost,macros,boost-preprocessor,C++,Boost,Macros,Boost Preprocessor,我发现了一个例子,它解释了如何使用c预处理器指令实现标识符令牌比较。这可以通过以下宏来完成: #define COMPARE_foo(x) x #define COMPARE_bar(x) x #define PRIMITIVE_COMPARE(x, y) IS_PAREN \ ( \ COMPARE_ ## x ( COMPARE_ ## y) (()) \ ) PRIMITIVE_COMPARE(foo, bar) // expands to 0 PRIMITIVE_COMPARE

我发现了一个例子,它解释了如何使用c预处理器指令实现标识符令牌比较。这可以通过以下宏来完成:

#define COMPARE_foo(x) x
#define COMPARE_bar(x) x
#define PRIMITIVE_COMPARE(x, y) IS_PAREN \
 ( \
 COMPARE_ ## x ( COMPARE_ ## y) (())  \
 )

PRIMITIVE_COMPARE(foo, bar) // expands to 0
PRIMITIVE_COMPARE(bar, bar) // expands to 1
#define ACCEPTED_TYPE (float)(int)(string)
#define Macro(x) // If one of accepted type do a otherwise do nothing
Which
是PAREN
检查它是否完全展开(这发生在两个宏由于不同的原因而不同时)

现在我正在Boost预处理器中寻找类似的命令。我想要一个宏的可接受类型的列表,如果用这种类型的宏调用宏,它将扩展到它必须的类型,否则它不会做任何事情。我的伪代码是这样的:

#define COMPARE_foo(x) x
#define COMPARE_bar(x) x
#define PRIMITIVE_COMPARE(x, y) IS_PAREN \
 ( \
 COMPARE_ ## x ( COMPARE_ ## y) (())  \
 )

PRIMITIVE_COMPARE(foo, bar) // expands to 0
PRIMITIVE_COMPARE(bar, bar) // expands to 1
#define ACCEPTED_TYPE (float)(int)(string)
#define Macro(x) // If one of accepted type do a otherwise do nothing

如果boost预处理器没有确切的解决方案,您有什么建议使实现更容易。

“涂蓝”不是一个常见的术语。该技巧之所以有效,是因为以这种特殊方式将宏应用于自身会创建一个递归宏扩展,而该宏扩展会被跳过,因为宏递归是被禁止的。无论如何,最好先说明你的具体问题,而不是最后一个,然后再进一步阐述。将自己限制在链接博客文章中的方法可能是一种错误。如果您不需要
接受类型的列表很容易改变,并且您使用的是足够现代的编译器和Boost 1.60(这是大量的“如果”),可以工作,但是如果您的用例与我在那里所做的非常相似,使用模板专门化有一种更好的方法。我认为这在Boost中还不是很好,但据我回忆,可能会对您有很大帮助。@Potatosatter谢谢您的建议。以后我会问得更清楚一些。但是我认为C语言也是一个术语。@ MohsenTamiz“蓝色”一词不出现在C或C++标准中,这是我第一次遇到这个短语。维基百科很困惑地说有一个“1972 C标准”;标准化发生在20世纪80年代。(啊,哈哈,在链接书的1972页上。)不过,谢谢你的链接。