2015-09-11 1 views
1

в основном то, что я хочу сделать, написано в коде. так, есть ли способ с шаблонами или с чем-то другим получить имя внешнего класса в глобальной функции? есть ли способ заставить этот код работать?Как получить внешнее имя класса из внутреннего enum

#include <iostream> 

class A 
{ 
public: 
    enum class B 
    { 
     val1, 
     val2 
    }; 
    typedef B InnerEnum; 
    static void f(InnerEnum val) 
    { 
     std::cout << static_cast<int>(val); 
    } 
}; 

template <typename T1> 
void f(typename T1::InnerEnum val) 
{ 
    T1::f(val); 
} 
int main() 
{ 
    A::InnerEnum v = A::InnerEnum::val1; 
    f(v); 
    return 0; 
} 
+1

в основном называют это нравится: 'е (V);' – Melkon

+0

спасибо для ответа. Но идея состоит в том, чтобы избежать использования имени внешнего класса – zapredelom

+0

Ох, я не уверен, что это возможно, но вы можете ввести внешний класс во внутренний класс. Я думаю, это должно сработать. (не с enum tho) – Melkon

ответ

4

Вы можете создать признак для этого и вручную кормить его:

template <typename T> 
struct outer_class; 

template <> 
struct outer_class<A::B> { using type = A;}; 

А потом

template <typename E> 
void f(E val) 
{ 
    using T = typename outer_class<E>::type; 
    T::f(val); 
}