5
私はis_functionの実装を次ていますstd :: is_functionの実装 - 私の実装の動作が異なるのはなぜですか?
template <typename SomeType>
struct _is_function_helper : public _false_expression {};
template <typename ReturnType, typename ... ArgumentTypes>
struct _is_function_helper<ReturnType (ArgumentTypes ...)> : _true_expression {};
template <typename ReturnType, typename ... ArgumentTypes>
struct _is_function_helper<ReturnType (ArgumentTypes ..., ...)> : _true_expression {};
template <typename SomeType>
struct _is_function : public _boolean_expression<_is_function_helper<typename _remove_cv<typename _remove_reference<SomeType>::Type>::Type>::value> {};
私は、参照を削除CV予選、その後_is_function_helperと同じように同じブール表現を継承しようとします。
void func(int,int) { };
struct A { void foo(int); };
....
auto r = func;
std::cout << std::boolalpha;
std::cout << std::is_function<decltype(func)>::value << " " << _is_function<decltype(func)>::value << std::endl;
std::cout << std::is_function<int(int)>::value << " " << _is_function<int(int)>::value << std::endl;
std::cout << std::is_function<int(*)(int)>::value << " " << _is_function<int(*)(int)>::value << std::endl;
std::cout << std::is_function<decltype(r)>::value << " " << _is_function<decltype(r)>::value << std::endl;
std::cout << std::is_function<decltype(*r)>::value << " " << _is_function<decltype(*r)>::value << std::endl;
std::cout << std::is_function<decltype(&A::foo)>::value << " " << _is_function<decltype(&A::foo)>::value << std::endl;
そして、ここでは、これらのテストの出力である:それから私は次のテストを試してみました
true true
true true
false false
false false
false true
false false
私は2つの質問がある:
- なぜ第五テストケースで出力が違うのですか?
- _is_functionを使用してstructのメンバ関数を検出する方法はありますか?
ああおかげで私はそれがこのhttp://en.cppreference.com/w/cppに応じても、検出の参照機能すべきであると思いました/ types/is_function –