Скажем, у меня есть макрос FOO(name) и некоторый класс шаблона Bar‹>, который принимает один параметр (какой тип параметра — вопрос). Каждый раз, когда я вызываю FOO с другим именем, я хочу получить другой экземпляр Bar. Шаблон Bar‹> на самом деле не должен иметь возможность получить внутреннее имя, мне просто нужно быть уверенным, что разные имена создают разные экземпляры Bar‹> и что использование одного и того же имени (даже в разных единицах перевода) всегда получает тот же экземпляр Bar‹>. Итак, вот грубая первая попытка:
template<const char* x>
class Bar
{
//... stuff
};
#define FOO(name) Bar<#name>
Это будет работать, за исключением того, что литералы char нельзя передавать в качестве параметров шаблона, поскольку они не имеют внешней связи. Если бы в препроцессоре был какой-то способ получить непротиворечивый хэш «имени», чтобы сказать, int (который затем может быть передан в шаблон), это сработало бы, но я не вижу никакого способа сделать это.
Идеи?