是否可以将带逗号的语句传递到升压测试宏中?
Is it possible to pass a statement with a comma into a boost test macro?
因为我想对我用 boost::test 编写的一个小 class 进行单元测试,我发现 CHECK/REQUIRE/.... 的 boost 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
别名 而不是显式类型,但您有其他想法吗?
与编译器相比,预处理器很简单,并且对它预处理的实际文本一无所知(它可以用于任何类型的文本文件,而不仅仅是 C 或 C++ 源文件)。这意味着它仅使用逗号作为宏调用中的参数分隔符,并且您不能传递包含逗号的宏参数。
如您所述,解决您的特定问题的一种方法是使用类型别名。
用简单的表达式,解决方法是把宏参数放在括号里,比如
BOOST_CHECK((std::is_same<int, int>::value));
但是,由于您在那里有一个块,所以该路径对您不开放(除非您不关心可移植性并且您的编译器接受它;例如,gcc 接受)。但是,知道表达式很好,我们可以用 lambda 来摆脱困境:
BOOST_CHECK_NO_THROW(([]{cache_map<int, int> test1(3);}()));
不过,您是否认为这比类型别名更漂亮取决于您。
因为我想对我用 boost::test 编写的一个小 class 进行单元测试,我发现 CHECK/REQUIRE/.... 的 boost 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
别名 而不是显式类型,但您有其他想法吗?
与编译器相比,预处理器很简单,并且对它预处理的实际文本一无所知(它可以用于任何类型的文本文件,而不仅仅是 C 或 C++ 源文件)。这意味着它仅使用逗号作为宏调用中的参数分隔符,并且您不能传递包含逗号的宏参数。
如您所述,解决您的特定问题的一种方法是使用类型别名。
用简单的表达式,解决方法是把宏参数放在括号里,比如
BOOST_CHECK((std::is_same<int, int>::value));
但是,由于您在那里有一个块,所以该路径对您不开放(除非您不关心可移植性并且您的编译器接受它;例如,gcc 接受)。但是,知道表达式很好,我们可以用 lambda 来摆脱困境:
BOOST_CHECK_NO_THROW(([]{cache_map<int, int> test1(3);}()));
不过,您是否认为这比类型别名更漂亮取决于您。