给定 #define 中的文本,是否可以以某种方式将其传递给模板?
假设我有一个宏、FOO(name) 和一些模板类 Bar<> 它需要一个参数(问题是什么类型的参数)。 每次我用不同的名称调用 FOO 时,我都想获得 Bar 的不同实例。 酒吧<> template 实际上并不需要能够在内部获取名称,我只需要确保不同的名称创建 Bar<> 的不同实例。 并且使用相同的名称(即使在不同的翻译单元中)总是得到 Bar<> 的相同实例。 所以这是一个粗略的第一次尝试:
template<const char* x>
class Bar
{
//... stuff
};
#define FOO(name) Bar<#name>
这会起作用,除了 char 文字不能作为模板参数传递,因为它们没有外部链接。 如果预处理器中有某种方式可以获取“名称”的一致散列,则可以使用 int (然后可以将其传递给模板),但我没有看到任何方法可以做到这一点。
有想法吗?
Say I have a macro, FOO(name), and some template class Bar<> that takes one parameter (what type of parameter is the question). Everytime I call FOO with a different name, I want to get a different instantiation of Bar. The Bar<> template doesn't actually need to be able to get at the name internally, I just need to be sure that different names create different instances of Bar<> and that using the same name (even in different translation units) always gets at the same instance of Bar<>. So here's a rough first attempt:
template<const char* x>
class Bar
{
//... stuff
};
#define FOO(name) Bar<#name>
This would work, except that char literals can't be passed as template parameters because they don't have external linkage. If there was someway in the preprocessor to get a consistent hash of 'name' to say, an int (which can then be passed to the template) that would work, but I don't see any way to do that.
Ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据您打算使用此宏的位置(命名空间或类范围都可以),您可以创建一个标记类型并使用它:
如果这不起作用,也许您可以预先“声明”这些名称:
Depending on where you intend to use this macro (namespace or class scope would work), you could create a tag type and use that:
If this doesn't work, maybe you can "declare" those names before-hand: