由于我想对使用boost :: test编写的小类进行单元测试,我发现如果你传递的语句包含一个&#39,则无法直接使用对CHECK / REQUIRE / ....的提升MACRO。 ;,'
以下示例未编译,因为预处理器报告macro "BOOST_CHECK_NO_THROW" passed 2 arguments, but takes just 1
BOOST_CHECK_NO_THROW({cache_map<int, int> test1(3);});
为了确认它来自我们用来分隔模板参数的逗号,我使用了以下内容并且编译没有问题。
BOOST_CHECK_NO_THROW({string test1("test");});
解决方法是使用typedef
别名而不是显式类型,但还有其他想法吗?
答案 0 :(得分:2)
使用简单表达式,解决方案是将宏参数放在括号中,例如
BOOST_CHECK((std::is_same<int, int>::value));
但是,由于你在那里有一个阻止,那个路径不对你开放(除非你不关心可移植性,你的编译器接受它;例如gcc)。但是,知道表达式很好,我们可以用lambdas来摆脱困境:
BOOST_CHECK_NO_THROW(([]{cache_map<int, int> test1(3);}()));
你是否认为这比类型别名更漂亮取决于你。
答案 1 :(得分:1)
与编译器相比,预处理器很简单,并且不知道它预处理的实际文本(它可以用于任何类型的文本文件,而不仅仅是C或C ++源文件)。这意味着它只是在宏调用中使用逗号作为参数分隔符,并且您不能传递包含逗号的宏参数。
如您所述,解决特定问题的一种方法是使用类型别名。