前回(VC++ 2015のbindとmem_fnは呼出規約付きの関数を扱える)のあと、「そういえばstd::is_functionはどうだっけ?」と思い、試してみました。

次のプログラムで確かめてみたところ、Visual C++ 2013からtrue_typeを返すようになっていました。

#include <type_traits>
 
void __stdcall f();
static_assert(std::is_function<decltype(f)>::value == true, "stdcall");

Visual C++ 2010~2012はこのstatic_assertに引っかかってしまいます。2013からは通りました。

ヘッダーファイルを見たところ、2013, 2015ともに<type_traits>からインクルードされている<xstddef>で_NON_MEMBER_CALLや_MEMBER_CALL_CVマクロにより対応していることが分かりました。x64向けに追加された__vectorcallにも対応しているようです。

これも、Boostでは以前から対応していました。Boostとの差異がなくなるという点でもありがたいことです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ VC++のis_functionは2013から呼出規約付きの関数に対応していた
  • ⇒ VC++のis_functionは2013から呼出規約付きの関数に対応していた