首页 > 解决方案 > 带有模板的 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++c++11templatesc-preprocessorgoogletest

解决方案


我想这是识别模板参数之间的逗号的 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 );
}

推荐阅读