2017-08-14 6 views
1

Quelle est la manière la plus élégante (peut-être C++ 17-way) pour vérifier si les signatures de deux méthodes définies dans deux classes différentes sont exactement les mêmes?Caractère de type pour faire correspondre les signatures des fonctions membres de différentes classes

Par exemple:

template< typename ...Ts > 
struct A 
{ 
    void f(Ts...); 
}; 

template< typename ...Ts > 
struct B 
{ 
    void g(Ts...); 
}; 

static_assert(has_same_signatures< decltype(&A<>::f), decltype(&B<>::g) >{}); 
static_assert(!has_same_signatures< decltype(&A<int>::f), decltype(&B<char>::g) >{}); 
//static_assert(has_same_signatures< decltype(&A<void>::f), decltype(&B<>::g) >{}); // don't know is it feasible w/o extra complexity 

Ce serait formidable, si les types de fonctions non-membres de chaque côté seraient autorisés aussi.

Peut-être que le type de résultat devrait aussi être enchevêtré.

La tâche provient du problème commun de la correspondance des signatures signal/emplacement dans le cadre Qt.

+0

@Barry Ne pense pas, que les esperluettes nécessaires. Pensez-vous que les références aux fonctions ne sont pas assez bonnes? – Orient

+1

Vous ne pouvez pas faire référence à une fonction membre non statique sans le '&'. – Barry

Répondre

1

Vous pouvez faire quelque chose comme:

// static member functions/free functions are the same 
// if their types are the same 
template <class T, class U> 
struct has_same_signature : std::is_same<T, U> { }; 

// member functions have the same signature if they're two pointers to members 
// with the same pointed-to type 
template <class T, class C1, class C2> 
struct has_same_signature<T C1::*, T C2::*> : std::true_type { }; 

Notez que A<void> est tout simplement mal formé que vous ne pouvez pas avoir un paramètre de type void.

+1

"signature" n'inclut pas "noexcept'-ness ou le type de retour, mais le type de fonction le fait (' noexcept'-ness depuis C++ 17); pendant ce temps, le type de fonction n'inclut pas * requires-clause * en C++ 20, mais "signature" le fait. Le PO doit spécifier plus précisément ce qu'il veut. –

+0

Où sont les types de paramètres? Je ne vois que des astérisques. Est-ce suffisant? – Orient

+0

@ T.C. Ha, c'est un trou beaucoup plus profond que prévu. – Barry