如何获得函数的返回类型

C++03: How to get the return type of a function?

本文关键字:返回类型 函数 何获得      更新时间:2023-10-16

我有一个结构体,看起来像这样:

struct Foo {
    typedef size_t result_type;
    template <class TYPE>
    result_type operator()(const TYPE& type) const;
};

我正在测试这个结构体,我希望能够断言operator()的返回类型等于size_t。如果我可以使用c++ 11,我会去decltype,然而,我只能访问c++ 03。我想测试一些看起来很明显的东西有几个原因:

  1. 我的团队有非常严格的测试政策,即使是可以通过视觉验证的东西也必须进行测试
  2. 回归测试。我想确保这在未来不会改变。
  3. 这是一个更简化的代码版本,事情有点复杂,值得在完整版本中进行更多的测试。

在c++ 03中我有哪些选项可以这样做?我不在乎它是编译时检查还是运行时检查,只是一些允许我在测试驱动程序中做断言的东西。

c++ 03没有直接请求返回类型的方法。您可以使用函数模板推断它(正如Cody Gray在注释中建议的那样),但对于您的测试目的,您不需要这样做。只需调用被测函数并将结果传递给重载集,如下所示:

template <typename AnythingElse>
void Foo(AnythingElse const&) { assert(false); }
void Foo(YourType const&) { /* pass */ }

也就是说,我认为测试返回类型可能是一个错误——测试实现细节而不是测试结果。

如果您需要强制某些数据结构或消息的二进制兼容性,您可能希望检查类型的属性而不是类型本身。在两个不同的体系结构中,对于size_t,这些可能会发生变化。

assert(EXPECTED_SIZE == sizeof(result_type));
assert(EXPECTED_MIN == std::numeric_limits<result_type>::min());
assert(EXPECTED_MAX == std::numeric_limits<result_type>::max());