2016-01-14 3 views
1

У меня есть ::Class1 и ::Class2, я хотел бы создать шаблонную функцию, которая получает либо первый или второй, а затем на основе выбранных использования класса других классов, определенных в различных именах т.е. NameSpace::Class1, NameSpace::Class2. Есть ли способ сделать это на C++?Различных типов на основе шаблона типа

Например:

namespace NameSpace 
{ 
    class Class1 {}; class Class2 {}; 
} 

template <class T> // example Class1 or Class2 
void f(T object) { 
    NameSpace::T obj; // Something like this, but it doesn't work 
} 
+3

Можете ли вы отправить пример кода? Я не уверен, как вы собираетесь это использовать. – TartanLlama

+0

namespace NameSpace { класс Class1 {}; класс Class2 {}; } шаблон // Пример Class1 или Class2 недействительными е (Т объект) { NameSpace :: Т OBJ; // Что-то вроде этого, но это не работает } – miqelm

+0

Но могу ли я выполнить эту инстанцию ​​общим способом, не проверяя тип (if else). Что с ситуацией со многими классами? – miqelm

ответ

1

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

template <typename T> 
struct FromType {}; 

template <> 
struct FromType<Class1> 
{ 
    typedef ns::Class1 type; 
} 

template <> 
struct FromType<Class2> 
{ 
    typedef ns::Class2 type; 
} 

Это может быть использовано в функция шаблона, обращаясь к полученному типу,

typename FromType<T>::type 

Обратите внимание, что это также будет давать ошибку компиляции, если вы пытаетесь использовать тип, отличный от Class1 или Class2.

3

NameSpace::T не работает, как T не имяClass1 или Class2, он представляет тип. Шаблоны не работают на текстовую подстановку, подобную этой.

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

struct Class1{}; struct Class2 {}; 

namespace NameSpace 
{ 
    class Class1 {}; class Class2 {}; 

    template <typename T> struct translate; 
    template<> struct translate<::Class1> { 
     using type = Class1; 
    }; 
    template<> struct translate<::Class2> { 
     using type = Class2; 
    }; 

    template <typename T> 
    using translate_t = typename translate<T>::type; 
} 

Вы могли бы использовать это так:

template <class T> 
void f(T object) { 
    using Translated = NameSpace::translate_t<T>; 
    Translated obj; 
} 
+0

Зачем нужен оператор разрешения области спектра для специализированных типов? – StoryTeller

+0

@StoryTeller Поскольку я помещал черту в 'NameSpace', чтобы не загрязнять глобальное пространство имен, поэтому имена Class1' NameSpace :: Class1' и ':: Class1' назовут имя в глобальном пространстве имен. – TartanLlama

+0

Получил это. Я неправильно понял вопрос ОП и запутался. – StoryTeller

0

Просто омните NameSpace в NameSpace::T. Пространство имен должно быть определено в вызове функции f. Следующий пример компилируется.

namespace NameSpace 
{ 
    class Class1 {}; class Class2 {}; 
} 

template <class T> // example Class1 or Class2 
void f(T object) { 
    T obj; 
} 

int main() 
{ 
    NameSpace::Class1 x; 
    f(x); 
    return 0; 
} 
Смежные вопросы