C ++ шаблонный typedef - PullRequest
       9

C ++ шаблонный typedef

5 голосов
/ 10 февраля 2010

У меня есть шаблонный класс

template <T>
class Example 
{
...
};

внутри которого есть Есть много методов следующего типа:

template <class U> <class V> method(....)

Внутри них я использую tr1 :: shared_ptr для U, V или T.

Утомительно печатать tr1::shared_ptr<const U> или tr1::shared_ptr<const V>.

Очевидное, что нужно сделать:

template <typename U>
typedef tr1::shared_ptr<U> shptr<U>;

не работает.

Что вы делаете в этой ситуации? Что-нибудь, что может уменьшить многословие?

Ответы [ 3 ]

9 голосов
/ 10 февраля 2010

Вы можете использовать внутренний тип:

template <typename U>
struct sptr {
    typedef tr1::shared_ptr<U> t;
};

Тогда скажите sptr<U>::t, или, к сожалению, часто typename sptr<U>::t.

C ++ 0x имеет шаблоны typedefs, вы можете проверить, можно ли убедить ваш компилятор принять их:

template<typename U>
using sptr = tr1::shared_ptr<U>;

Тогда скажи sptr<U>

И, конечно, всегда есть #define sptr ::tr1::shared_ptr, например, если вы ожидаете C ++ 0x в будущем и хотите сократить разрыв. Или если вы используете его в достаточно узком контексте, чтобы макрос не был страшным.

2 голосов
/ 10 февраля 2010

Ничто не уменьшает многословия (кроме того, что говорит икра).

Но хорошая статья о самой проблеме: Шаблон Typedef .

Вам действительно понадобится этот трюк, если у вас есть какая-то универсальная функция, которая ожидает, что ваш тип будет иметь некоторую связанную typedef, а ваш тип является шаблонным (учтите, что вы предоставили result_t и это должен быть ваш параметр шаблона!).

1 голос
/ 10 февраля 2010
using tr1::shared_ptr;

должен позволять вам использовать shared_ptr без префикса, но это все, что я знаю. К сожалению.

...