给定 #define 中的文本,是否可以以某种方式将其传递给模板?

发布于 2024-07-30 11:26:13 字数 498 浏览 1 评论 0原文

假设我有一个宏、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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

近箐 2024-08-06 11:26:13

根据您打算使用此宏的位置(命名空间或类范围都可以),您可以创建一个标记类型并使用它:

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

Depending on where you intend to use this macro (namespace or class scope would work), you could create a tag type and use that:

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

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

If this doesn't work, maybe you can "declare" those names before-hand:

#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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文