2016-03-24 5 views
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つの質問がある:

  1. なぜ第五テストケースで出力が違うのですか?
  2. _is_functionを使用してstructのメンバ関数を検出する方法はありますか?

答えて

5

decltype(*r)は関数への参照であるため、5番目のケースの出力が異なります。あなたの実装はこの参照を削除しますが、std::is_functionはそうしません。

あなたは、このように特殊化を追加することによって、メンバ関数ポインタを検出することができます。

template <typename ReturnType, typename ... ArgumentTypes, typename T> 
struct _is_function_helper<ReturnType (T::*) (ArgumentTypes ...)> 
    : _true_expression {}; 
+0

ああおかげで私はそれがこのhttp://en.cppreference.com/w/cppに応じても、検出の参照機能すべきであると思いました/ types/is_function –

関連する問題