2017-04-25 2 views
1

Je suis en train d'accéder à un hana::type d'une paire en utilisant hana::second ...hana :: seconde ne peut pas en déduire le type

namespace hana = boost::hana; 
using namespace hana::literals; 

struct Key {}; 
struct Foo {}; 

int main() { 

    auto test = hana::make_tuple(
     hana::make_pair(
     hana::type_c<Key>, 
     hana::type_c<Foo>)); 

    typename decltype(hana::type_c<Foo>)::type finalTest; //Ok 
    typename decltype(hana::second(test[0_c]))::type finalTest2; //Error 
} 

mais je reçois l'erreur du compilateur suivant:

stacktest.cpp: In function ‘int main()’: 
stacktest.cpp:17:12: error: decltype evaluates to ‘boost::hana::type_impl<Foo>::_&’, which is not a class or enumeration type 
    typename decltype(hana::second(test[0_c]))::type finalTest2; 

Pourquoi le résultat de hana::second ne renvoie pas le contenu hana::type comme prévu?

+0

Je downvoted parce que c'est Stack Overflow et pas What's App - S'il vous plaît être plus formel dans vos titres et supprimer le langage inapproprié comme "_wtf_" –

+0

Pourriez-vous s'il vous plaît coller le message d'erreur et nous dire quel est le résultat que vous attendez? – Roberto

+0

Quelle erreur obtenez-vous? Est-ce que 'boost :: tuple' a un' operator [] '? – NathanOliver

Répondre

4

Le message d'erreur indique que le decltype évalue à boost::hana::type_impl<Foo>::_&, qui, tout en un peu cryptique, vous pouvez voir par le & à la fin qu'il est une référence au contenu hana::type. Malheureusement, la référence ne contiendra pas les membres que vous vous attendez à trouver dans le type brut.

Pour cette hana::type fournit un operator+ unaire qui déréférence simplement le type brut afin que vous puissiez effectuer les opérations suivantes:

typename decltype(+hana::second(test[0_c]))::type finalTest2; 

hana::typeid_ œuvres pour ce aussi bien qu'il enveloppe idempotently toute valeur dans un hana::type avec const et qualifications de référence décapés:

typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2; 

Il convient de noter que toutes les fonctions Hana suivantes renvoient des références:

first, second, at, at_key, et associé operator[].

+0

L'opérateur unaire + travaille pour moi, mais quand j'essaie d'utiliser 'hana :: typeid_', j'obtiens une erreur de compilation qui ne trouve pas de 'typeid_' dans l'espace de noms hana. Une idée de pourquoi cela serait? J'ai inclus génériquement et je crois que j'utilise le dernier boost (en supposant que homebrew a le dernier boost parce que je suis assez sûr que cmake est lié à la copie de brassage). Cette fonction a-t-elle été ajoutée ou supprimée à un certain moment? – RyanP

+0

Il a été ajouté dans Boost 1.62. https://github.com/boostorg/hana/commit/edbbffeea4c1b118f4d634098dfa7ec2faa0f95d –