给定#define中的文本,它可以以某种方式传递给模板吗?

时间:2009-08-10 22:06:41

标签: c++ templates c-preprocessor

假设我有一个宏,FOO(名称)和一些模板类Bar<>这需要一个参数(问题是什么类型的参数)。每当我用不同的名字给FOO打电话时,我想得到一个不同的Bar实例。酒吧<>模板实际上不需要能够在内部获取名称,我只需要确保不同的名称创建不同的Bar<>实例。并且使用相同的名称(即使在不同的翻译单元中)总是得到Bar<>的相同实例。所以这是一个艰难的第一次尝试:

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

#define FOO(name) Bar<#name>

这可以工作,除了char文字不能作为模板参数传递,因为它们没有外部链接。如果在预处理器中有某种​​方法可以获得一个“name”的一致哈希值,那么int(可以传递给模板)可以工作,但是我没有看到任何方法。

想法?

1 个答案:

答案 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);