Имея текст в #define, можно ли его как-то передать в шаблон? - PullRequest
1 голос
/ 11 августа 2009

Скажем, у меня есть макрос, FOO (имя) и некоторый шаблон класса Bar <>, который принимает один параметр (какой тип параметра является вопросом). Каждый раз, когда я звоню в FOO с другим именем, я хочу получить иную версию Bar. Шаблон Bar <> на самом деле не должен быть в состоянии получить внутреннее имя, я просто должен быть уверен, что разные имена создают разные экземпляры Bar <> и что использование одного и того же имени (даже в разных единицах перевода) всегда попадает в тот же экземпляр Bar <>. Итак, вот грубая первая попытка:

template<const char* x>
class Bar
{
//... stuff
};

#define FOO(name) Bar<#name>

Это будет работать, за исключением того, что литералы символов не могут быть переданы в качестве параметров шаблона, поскольку они не имеют внешней связи. Если бы в препроцессоре был какой-то способ получить согласованный хэш «name», чтобы сказать, int (который затем можно передать в шаблон), который бы работал, но я не вижу никакого способа сделать это.

Идеи

1 Ответ

4 голосов
/ 11 августа 2009

В зависимости от того, где вы собираетесь использовать этот макрос (пространство имен или область действия класса будут работать), вы можете создать тип тега и использовать его:

template<typename T>
class Bar
{
//... stuff
};

#define FOO(name) struct some_dummy_tag_for_##name {}; Bar<some_dummy_tag_for_##name>

Если это не сработает, возможно, вы сможете «объявить» эти имена заранее:

#define DECLARE_FOO(name) struct some_dummy_tag_for_##name {}
#define FOO(name) Bar<some_dummy_tag_for_##name>

// something.h
DECLARE_FOO(foobar);

// something.cpp
FOO(foobar);
...