c++ - 带有模板的 GoogleTest
问题描述
希望这个问题不会太愚蠢。我在使用 gtest 方面很新,而且很长一段时间我都没有使用 C++。假设 w 有这个简单的模板Point
类:
template <class T>
struct Point
{
union
{
T _data [2];
struct { T x, y; };
};
constexpr Point(T x_, T y_) noexcept : x(x_), y(x_) {}
};
然后使用 gtest,我试图检查是否Point
是默认可构造的:
TEST_P(PointTest,Concept)
{
ASSERT_TRUE(std::is_nothrow_constructible<Point<float>,float,float>::value);
}
然后我使用带有 C++11 标志的 Clang 6.0.1 得到这个编译错误:
"error: too many arguments provided to function-like macro invocation"
欢迎任何帮助。我知道在结合模板和 googletest 时必须特别小心。但我没有想出解决办法。谢谢 !
解决方案
我想这是识别模板参数之间的逗号的 C++ 预处理器的问题
// ...................................................v.....v
ASSERT_TRUE(std::is_nothrow_constructible<Point<float>,float,float>::value);
作为宏参数分隔符。
我建议计算宏调用之外的值
TEST_P(PointTest,Concept)
{
constexpr auto val
= std::is_nothrow_constructible<Point<float>, float, float>::value;
ASSERT_TRUE( val );
}
或通过 ausing
类型
TEST_P(PointTest ,Concept)
{
using inc = std::is_nothrow_constructible<Point<float>, float, float>;
ASSERT_TRUE( inc::value );
}
推荐阅读
- python - 如何根据索引合并两个 numpy 数据集?
- python - 以一组元组为值的字典理解
- python - 从python中的多个链接下载并将其存储在多个列表中
- c# - 如何等待表为空/消息队列已处理?
- c - strsep() 导致段错误 - 为什么?
- java - 将鼠标悬停在其方法和类上时如何显示导入库的 Javadoc?
- python - 如何使用条件从多维 numpy 数组中删除子数组?
- python - 用rabbitmq在数据库上写
- delegates - 在 BPMN 中将 Java Delegate 与 Delegate Expression 一起使用时,表达式中使用了未知属性
- python - 通过比较子数组将numpy数组转换为方数组