是否可以将带逗号的语句传递给boost测试宏?

时间:2015-01-22 10:44:51

标签: c++ unit-testing templates boost

由于我想对使用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别名而不是显式类型,但还有其他想法吗?

2 个答案:

答案 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 ++源文件)。这意味着它只是在宏调用中使用逗号作为参数分隔符,并且您不能传递包含逗号的宏参数。

如您所述,解决特定问题的一种方法是使用类型别名。