2016-06-07 7 views
3
struct class1 
{ 
    enum res 
    { 
     a = 9, 
     b = 15 
    }; 

    class1(res e) { } 
}; 

struct class2 
{ 
    enum res 
    { 
     he = 5, 
     de = 2 
    }; 

    class2(res e) {} 
}; 

template<typename T, typename E> 
void fn(E e) 
{ 
    foo(T(e)); 
} 

Diese Funktion funktioniert, kann ich es wie fn<class2>(class2::he)); zum Beispiel nennen, aber ich will nicht explizit class2 zweimal angeben.erhalten den umschließenden Typen eines [Enum-Mitglied?]

Gibt es eine Möglichkeit, den Typ "class2" basierend auf class2::he abzuleiten?

+0

ich nicht jetzt, wenn eine solche Art und Weise vorhanden ist, aber zumindest gibt es ein bisschen schmutzig Abhilfe: Sie können Aufzählungen mit Klassen mit 'statischen constexpr' consts und so etwas wie' mit Base ersetzen =/* class1 oder class2 * /; 'innen. – HolyBlackCat

+1

Wie würden Sie 'Klasse C1 {enum E1 {}} unterscheiden? Klasse C2 {mit E2 = C1 :: E1} 'aus' Klasse C2 {enum E2 {}}; Klasse C1 {mit E1 = C2 :: E2} '? C++ unterscheidet zwischen Typen und Namen. Insbesondere kann ein Typ mehrere (verschachtelte) Namen haben. Typabzug in Vorlagen gibt Ihnen einen Typ und noch einen anderen Namen für diesen Typ. (hier 'typename T') – MSalters

Antwort

0

Wie wäre es mit einigen Hilfsmetafunktionen, um den gewünschten Typ zu erhalten?

#include <type_traits> 

struct class1 
{ 
    enum res 
    { 
     a = 9, 
     b = 15 
    }; 

    class1(res e) { } 
}; 

struct class2 
{ 
    enum res 
    { 
     he = 5, 
     de = 2 
    }; 

    class2(res e) {} 
}; 

auto get_enclosing_type(class1::res) -> class1; 
auto get_enclosing_type(class2::res) -> class2; 

template <typename T> 
using get_enclosing_type_t = decltype(get_enclosing_type(std::declval<T>())); 

template<typename E> 
void fn(E const e) 
{ 
    using type = get_enclosing_type_t<E>; 
    foo(type {e}); 
} 
Verwandte Themen