假设我有一个宏,FOO(名称)和一些模板类Bar<>这需要一个参数(问题是什么类型的参数)。每当我用不同的名字给FOO打电话时,我想得到一个不同的Bar实例。酒吧<>模板实际上不需要能够在内部获取名称,我只需要确保不同的名称创建不同的Bar<>实例。并且使用相同的名称(即使在不同的翻译单元中)总是得到Bar<>的相同实例。所以这是一个艰难的第一次尝试:
template<const char* x>
class Bar
{
//... stuff
};
#define FOO(name) Bar<#name>
这可以工作,除了char文字不能作为模板参数传递,因为它们没有外部链接。如果在预处理器中有某种方法可以获得一个“name”的一致哈希值,那么int(可以传递给模板)可以工作,但是我没有看到任何方法。
想法?
答案 0 :(得分:4)
根据您打算使用此宏的位置(命名空间或类范围可行),您可以创建标记类型并使用它:
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);