2016-08-04 2 views
2

Ich versuche, die Rückgabe- und Argumenttypen einer Elementfunktion zu extrahieren, ohne mit const und volatile Überlastungen kümmern zu müssen, aber es scheint mir, dass ::std::remove_cv<> nicht mit Funktionstypen arbeiten:sollte :: std :: remove_cv <> auf Funktionstypen arbeiten?

template <typename> 
struct signature 
{ 
}; 

template <typename R, typename ...A> 
struct signature<R(A...)> 
{ 
}; 

template <typename C, typename F> 
constexpr auto extract_function_type(F C::* const) noexcept 
{ 
    return signature<::std::remove_cv_t<F>>(); 
} 

template <typename F> 
constexpr auto extract_signature(F const&) noexcept -> 
    decltype(&F::operator(), extract_function_type(&F::operator())) 
{ 
    return extract_function_type(&F::operator()); 
} 

Antwort

2

Es ist so etwas wie ein const Funktionsart nO:

[dcl.fct]/6:

die Wirkung eines CV-Qualifier-seq in einer Funktion als declarator ADDI nicht die gleiche ng cv-qualification on top des Funktionstyps. Im letzteren Fall werden die cv-Qualifikationsmerkmale ignoriert. [Hinweis: Ein Funktionstyp mit einem cv-qualifier-seq ist kein cv-qualifizierter Typ; Es gibt keine cv-qualifizierten Funktionstypen. -Ende note]

Sie haben Ihre eigene Art Eigenschaft schreiben:

template<typename T> 
struct remove_cv_seq; 

template<typename R, typename... Args> 
struct remove_cv_seq<R (Args...) const> { 
    using type = R (Args...); 
}; 

template<typename R, typename... Args> 
struct remove_cv_seq<R (Args...)> { 
    using type = R (Args...); 
}; 

struct Foo { 
    remove_cv_seq<void() const>::type bar; 
}; 

int main() 
{ 
    Foo const x; 
    x.bar(); // This will fail to compile because it tries to call non-const member function. 
} 
+0

Ahhh, dachte ich, so viel, wie etwa ref qualifizierte Funktionstypen, muss ich diese natürlich auch strippen? – user1095108

+0

@ user1095108 ja. Es gibt eine Menge Standard. Ich habe das Nötigste gepostet. – Simple

+0

Ok, ok, wenn es eine elegantere Lösung ohne das Boilerplate gibt, fügen Sie bitte Ihre Antwort hinzu. – user1095108

Verwandte Themen