2013-10-09 3 views
1

У меня есть шаблонный typedef (вроде как я знаю, что thery не является законным) в C++.C++ - создание шаблонов typedef public и accessibe через файлы include

в основном, такие определения типов предназначены, чтобы избежать написания всего моего кода длинных typenames (я хочу, чтобы иметь возможность написать typeA someVariable; вместо typename Foo<T,N,P>:: typeA someVariable;).

Ниже вы найдете код того, чего я пытаюсь достичь.

#ifndef FOO 
#define FOO 


template <class T, class N, class P> 
class Foo 
{ 
public: 
     typedef T typeA; 

     Foo(); 
}; 

template <class T, class N, class P> 
Foo<T, N, P>::Foo(){} 


#endif 


#ifndef FOOUSER 
#define FOOUSER 

#include "Foo.h" 

template <class T, class N, class P> 
typedef typename Foo<T,N,P>::typeA typeA; 

template <class T, class N, class P>  
typeA fooUser(Foo<T,N,P> foo) 
{ 

    typeA typeAInstance; 


    // some code; 


    return typeAInstance; 
} 


#endif 



#include <cstdlib> 
#include <iostream> 


#include "FooUser.h" 
using namespace std; 


typedef int dummyT1; 
typedef int dummyT2; 
typedef int dummyT3; 

int main(int argc, char *argv[]) 
{ 



    typeA typeAObject; 
    Foo<dummyT1, dummyT2, dummyT3> foo=Foo<dummyT1, dummyT2, dummyT3>(); 


    //somecode here 

    typeAObject=fooUser(foo); 



    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

Так что я объявлял типы в файле fooUser.h, в верхней части, за пределами функции SomeFunction для того, чтобы сделать их общедоступными. проблема, однако, что шаблоны не являются законными в C++. Я использую C++ 98.

Поэтому параметризованные псевдонимы типа (введенные в C++ 11), такие как

template <typename T> 
using typeA = typename Foo<T>::TypeA; 

не вариант.

зная, что мой синтаксис не является законным, я ищу альтернативное решение.

ответ

2

Вы можете создать контейнер-шаблон, чтобы уменьшить нагрузку.

template <class A, class B, class C> 
struct TemplateContainer { 
    typedef A A_t; 
    typedef B B_t; 
    typedef C C_t; 
}; 

template <class TC> 
class User { 
public: 
    typedef typename TC::A_t A_t; 
    typedef typename TC::B_t B_t; 
    typedef typename TC::C_t C_t; 
private: 
    A_t _a; 
    B_t _b; 
    C_t _c; 
public: 
    User(A_t a, B_t b, C_t c) : 
     _a(a), _b(b), _c(c) 
    {} 
}; 


template <class TC> 
User<TC> Usage() { 
    typename User<TC>::A_t a; 
    typename User<TC>::B_t b; 
    typename User<TC>::C_t c; 

    User<TC> user(a,b,c); 

    // ... 
    return user; 
} 

int main() { 
    typedef TemplateContainer<int,double,char> TC; 

    User<TC> user=Usage<TC>(); 
} 
+0

Хорошо, спасибо, я думаю, это лучший возможный компромисс ... лучше, чем ничего. – geraldCelente

0

Нет, параметры шаблона неявно распространяются из аргументов.

+0

Извините, что не понимаю. Что вы имеете в виду? – geraldCelente

+0

@geraldCelente: вы не можете написать 'fooUser (Foo foo)' с * любым * возвращаемым типом - 'Foo' является шаблоном, и вам не удалось указать его аргументы шаблона. Компилятор не будет автоматически создавать 'fooUser' шаблон с теми же аргументами, что и' Foo'. –

Смежные вопросы