2016-12-04 6 views
2

Im Entwurf der Standardspezifikation N4606, ++ ISO C in §20.15.6 wird is_callable wie folgt definiert:Wie zu verstehen is_callable Definition?

template <class Fn, class...ArgTypes, class R> 
struct is_callable<Fn(ArgTypes...), R> 

Der Ausdruck INVOKE(declval<Fn>(),declval<ArgTypes>()...,R) gut, wenn sie als unevaluierten Operanden behandelt gebildet wird.

Soweit ich Fn(ArgTypes...) verstehen, ist die Signatur einer Funktion eine Fn Rückkehr und nimmt als Argumente ArgTypes....

So INVOKE(declval<Fn>(),...) wird versuchen, den Rückgabewert der Funktion aufrufen ??

Also was ist das Ziel von is_callable? Oder wo irre ich mich?

+0

Was 'INVOKE' ist, nebenbei bemerkt? Ich sehe es in der C++ - Referenz erwähnt, kann aber die Definition nicht finden. –

+1

Ich denke, eine Idee hinter 'std :: is_callable' ersten Parameter ist ähnlich zu [' std :: result_of'] Parameter ( –

+1

@VioletGiraffe: http : //en.cppreference.com/w/cpp/utility/functional/invoke –

Antwort

3

Für mein Verständnis std::is_callable wird die Frage, ob eine Instanz von Fn beantworten kann mit Instanzen von ArgTypes... als Parameter aufgerufen werden und wenn dieser Aufruf in einem Objekt von R Art führen.

Ihnen ein Beispiel geben:

#include <type_traits> 

struct A { 
    int operator()(int, float, double) { return 0; } 
}; 

int main() { 
    static_assert(std::is_callable<A(int, float, double), int>::value, "!"); 
    static_assert(!std::is_callable<A(int, int), int>::value, "!!"); 
} 

[live demo]