2016-02-18 6 views
2

Я только что закончил итерацию в библиотеке, которую я пишу. Чтобы изолировать определенные типы, я изначально помещал их в пространство имен. Тогда я понял, что это пространство имен на самом деле должно быть шаблонный, поэтому я включил его в структуры, а именно:Использование структуры шаблона в качестве пространства имен

namespace A 
{ 
    typedef _foo foo; 
} 

стал

template <class T> 
struct A 
{ 
    typedef _foo<T> foo; 
}; 

Это было более удобно использовать, скажем, такой ситуации:

template <class T> 
class MyClass 
{ 
public: 
    typedef A<T>    nsA; 
    typedef typename nsA::foo foo_type; 
}; 

Теперь я использую эту библиотеку в другой библиотеке, и там, я знаю, что тип шаблона T никогда не изменится. Поэтому я хотел бы сделать что-то вроде:

namespace B 
{ 
    using namespace A<double>; 
} 

, но, очевидно, это не работает. Конечно, я мог бы просто перестать быть ленивым, и typedef вручную каждое определение в A<double>, но мне нравится быть ленивым, когда я могу. Любые мысли о том, как сделать что-то эквивалентное этому последнему шагу?

+0

В C++ 11 вы можете псевдоним всего вашего шаблона: 'namespace A {template using foo = _foo ; } ', а затем в' MyClass': 'using foo_type = A :: foo ;' (вы повторяете 'T', но избавляетесь от' typename'). Это не решает ваш фиксированный параметр btw. – Jarod42

ответ

1

На самом деле, я только что нашел ответ. Извините, если вы считаете, что этот вопрос бесполезен, я удалю его, просто дайте мне знать в комментарии.

Поскольку я использовал-структуру в качестве пространства имен, в первую очередь, решение продолжать использовать на структуру в качестве пространства имен (!):

struct B 
    : public A<double> 
{}; 

Вот demo.

+2

BTW, наследование является 'public' по умолчанию с' struct', поэтому вы можете упростить 'struct B: A {};'. – Jarod42

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