(编译时)单元测试调用多个重载中的哪一个

时间:2015-07-26 16:36:43

标签: c++ unit-testing metaprogramming

考虑以下代码:

    struct A {};
    struct B : A {};

    bool f(A,A) { /* ... */ }
    bool f(B,B) { /* ... */ }

现在假设我有类似

的地方
    // ...
    b = f(x,y);
    // ...

我想通过(可能是编译时或运行时)单元测试确保此代码序列调用f的特定重载。假设f(B,B)f(A,A)的一些专门的优化版本,因此它在功能上是等效的,但速度更快。我只能通过查看结果来确定调用了哪个函数。

当然,一种可能性是让f设置一些全局标志。

另一种可能性就像是

   template <class X, class Res> struct Distinguish {
       using Tag = X;
       Res m_res;
       explicit Distinguish (Res res) : m_res (res) { }
       operator Res () const { return m_res; }
   };

   Distinguish<char[1], bool> f (A, A) { /* ... */ }
   Distinguish<char[2], bool> f (B, B) { /* ... */ }

然后检查decltype(f (x,y))::Tag。然而这很难看,因为我必须改变f的签名。

还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在调试器中执行它。您可能必须在函数定义中的大括号之前放置回车符。