2016-09-12 5 views
2

Ich möchte eine Eigenschaft des Typs einer Variablen testen. Ich kann es, aber der Code ist zu ausführlich.Typ Merkmal durch eine Variable des Typs

Betrachten wir ein Beispiel, in dem ich eine Variable vom gleichen Typ wie der Typ eines Werts in einem Behälter zu definieren:

#include <vector> 

int main() { 
    std::vector<int> v, &rv=v; 

    // ‘rv’ is not a class, namespace, or enumeration 
    //rv::value_type i1; 

    // Ok 
    decltype(v)::value_type i2; 

    // decltype evaluates to ‘std::vector<int>&’, which is not a class or enumeration type 
    //decltype(rv)::value_type i3; 

    // Ok 
    std::remove_reference<decltype(rv)>::type::value_type i4; 
} 

kann ich leben decltype, aber std::remove_reference Zugabe zu viel ist. Gibt es eine gute Möglichkeit, den Code zu verkürzen, ohne Hilfsvorlagen zu definieren?

+2

Welche Eigenschaft möchten Sie testen? (Das sieht ähnlich aus wie ein [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).) – molbdnilo

+0

Weiß nicht, die 'remove_reference' Zeile sieht nicht so aus schlecht für mich, esp. wenn man bedenkt, dass man das nicht Dutzende Male machen wird. Davon abgesehen lautet die Antwort wahrscheinlich "Nein". –

+0

Wenn Sie es wiederholt verwenden, verwenden Sie möglicherweise eine 'using' Anweisung und alias es zu' value_type' oder etwas – jaggedSpire

Antwort

0

Sie können, dass verkürzen mit einem

std::decay_t<decltype(rv)>::value_type i4 = 42; 

oder

std::decay_t<decltype(*std::begin(rv))> i4 = 42; 
0

einige mit Erklärungen verwenden:

using my_value_type = decltype(v)::value_type; 
using your_value_type = std::remove_reference<decltype(rv)>::type::value_type; 

Ihr Code wird geworden:

int main() { 
    std::vector<int> v, &rv=v; 

    using my_value_type = decltype(v)::value_type; 
    using your_value_type = std::remove_reference<decltype(rv)>::type::value_type; 

    my_value_type i2; 
    your_value_type i4; 
} 
Verwandte Themen