2016-03-24 14 views
5

Ho seguito dell'attuazione della is_function:Implementazione di std :: is_function - perché la mia implementazione si comporta diversamente?

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> {}; 

rimuovo i riferimenti, qualificazioni cv e poi cercare di ereditare da stessa espressione bool come _is_function_helper avrebbe fatto. Poi ho provato seguenti test:

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; 

E qui viene emesso di questi test:

true true 
true true 
false false 
false false 
false true 
false false 

Ho due domande:

  1. Perché è uscita nel quinto caso di test diverso?
  2. Come è possibile rilevare la funzione membro di struct utilizzando _is_function?

risposta

5

L'uscita nel quinto caso è diversa perché decltype(*r) è un riferimento a una funzione. La tua implementazione rimuove questo riferimento, ma non lo fa std::is_function.

È possibile rilevare un puntatore a funzione membro con l'aggiunta di una specializzazione in questo modo:

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

ah grazie ho pensato che dovrebbe rilevare anche funzionare i riferimenti in base a questo http://en.cppreference.com/w/cpp/tipi/is_function –

Problemi correlati