Прелесть этого в том, что макрос делает именно то, что вы хотите от «шаблона typedef», минусом является то, что вы не можете использовать «<>» для параметров типа, и нет никакого вывода типа ,

ользую libgc, сборщик мусора для C и C ++. Чтобы сделать контейнеры STL мусорными, нужно использовать gc_allocator.

Вместо того чтобы писать

std::vector<MyType> 

надо писать

std::vector<MyType,gc_allocator<MyType> >

Может ли быть способ определить что-то вроде

template<class T> typedef std::vector<T,gc_allocator<T> > gc_vector<T>;

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

Определение карт таким способом особенно неприятно.

std::map<Key,Val> 

становится

std::map<Key,Val, std::less<Key>, gc_allocator< std::pair<const Key, Val> > >

РЕДАКТИРОВАТЬ: После попытки использования макроса я обнаружил, что следующий код ломает его:

#define gc_vector(T) std::vector<T, gc_allocator<T> >
typedef gc_vector( std::pair< int, float > ) MyVector;

Запятая внутри определения шаблонного типа интерпретируется как разделитель аргументов макроса.

Таким образом, кажется, внутренний класс / структура - лучшее решение.

Вот пример того, как это будет сделано в C ++ 0X

// standard vector using my allocator
template<class T>
using gc_vector = std::vector<T, gc_allocator<T> >;

// allocates elements using My_alloc
gc_vector <double> fib = { 1, 2, 3, 5, 8, 13 };

// verbose and fib are of the same type
vector<int, gc_vector <int>> verbose = fib; 

Ответы на вопрос(4)

Ваш ответ на вопрос