boost::function_typesのマクロ設定による動作変化

VC++7.1と9で確認したboost::function_typesのマクロ設定による動作変化の表です。

わけわからなかったから出力してみた。
解かったこと。

  1. デフォルトでfastcallとかに対応しない
  2. 設定は追加的じゃない。一部に対応させると他が効かなくなる

この2つのことから、thiscallもfastcallもstdcallも、というときは、COMMON_X86_CCだけだとthiscallに対応してない(ちゃんとマニュアルにそう書いてる)ので、

#define BOOST_FT_COMMON_X86_CCs callable_builtin
#define BOOST_FT_CC_IMPLICIT non_variadic|member

と両方書くことになる。

  • TF = type_traits::is_function_pointer
  • FF = function_types::is_function_pointer
  • TM = type_traits::is_member_function_pointer
  • FM = function_types::is_member_pointer
  • FMF = function_types::is_member_function_pointer
DEFAULT TF FF TM FM FMF
void (__cdecl*)(void) 1 1 0 0 0
void (__fastcall*)(void) 1 0 0 0 0
void (__stdcall*)(void) 1 0 0 0 0
void (__thiscall A::*)(void) 0 0 1 1 1
void (__fastcall A::*)(void) 0 0 1 1 0
void (__stdcall A::*)(void) 0 0 1 1 0
#define BOOST_FT_CC_FASTCALL callable_builtin TF FF TM FM FMF
void (__cdecl*)(void) 1 0 0 0 0
void (__fastcall*)(void) 1 1 0 0 0
void (__stdcall*)(void) 1 0 0 0 0
void (__thiscall A::*)(void) 0 0 1 1 0
void (__fastcall A::*)(void) 0 0 1 1 1
void (__stdcall A::*)(void) 0 0 1 1 0
#define BOOST_FT_COMMON_X86_CCs callable_builtin TF FF TM FM FMF
void (__cdecl*)(void) 1 1 0 0 0
void (__fastcall*)(void) 1 1 0 0 0
void (__stdcall*)(void) 1 1 0 0 0
void (__thiscall A::*)(void) 0 0 1 1 0
void (__fastcall A::*)(void) 0 0 1 1 1
void (__stdcall A::*)(void) 0 0 1 1 1
上記に#define BOOST_FT_CC_IMPLICIT non_variadic/memberを追加 TF FF TM FM FMF
void (__cdecl*)(void) 1 1 0 0 0
void (__fastcall*)(void) 1 1 0 0 0
void (__stdcall*)(void) 1 1 0 0 0
void (__thiscall A::*)(void) 0 0 1 1 1
void (__fastcall A::*)(void) 0 0 1 1 1
void (__stdcall A::*)(void) 0 0 1 1 1