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