获取成员函数的返回类型的大小

时间:2018-07-03 13:58:35

标签: c++ types stl

我有带有成员函数的类/结构。我想检查返回类型的大小是否正确。

#include <iostream>
#include <type_traits>

struct QString {
    wchar_t ucs2() {return L"1"[0];}
};

int main() {
    QString arg;
    std::cout << "wchar_t   " << sizeof(wchar_t) << std::endl;
    std::cout << "std::invoke_result_t<decltype(&QString::ucs2)(void)>   " << sizeof(std::invoke_result_t<decltype(&QString::ucs2)(void)>)  << std::endl;
}

例如,结果为

wchar_t   4
std::invoke_result_t<decltype(&QString::ucs2)(void)>   16

所以我得到不同的尺寸。我期望std::invoke_result_t<decltype(&QString::ucs2)(void)是我的ucs2函数的返回类型,即wchar_t,但事实并非如此。这是怎么回事?

2 个答案:

答案 0 :(得分:2)

invoke_result定义为:

template< class F, class... ArgTypes>
class invoke_result;

因此,这可以正常工作

return sizeof(std::invoke_result_t<decltype(&QString::ucs2), QString>);

答案 1 :(得分:2)

一个更简单的解决方案:

int main() {
  std::cout << sizeof(QString().ucs2()) << '\n';
  return 0;
}

QString()的默认构造一个QString,然后可以将其用于调用ucs2。但是由于这一切都是作为sizeof的操作数发生的,因此实际上没有构造或调用任何东西。即使没有启用优化,编译器也会在编译时进行所有类型分析。

很明显,如果您不能默认构造该类,则此方法可能没用。