boost::function_typesのマクロ設定による動作変化
VC++7.1と9で確認したboost::function_typesのマクロ設定による動作変化の表です。
わけわからなかったから出力してみた。
解かったこと。
- デフォルトでfastcallとかに対応しない
- 設定は追加的じゃない。一部に対応させると他が効かなくなる
この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 |