【问题标题】:Given text in a #define, can it somehow be passed to a template?给定#define 中的文本,能否以某种方式将其传递给模板?
【发布时间】:2009-08-10 22:06:41
【问题描述】:

假设我有一个宏 FOO(name) 和一些模板类 Bar,它接受一个参数(问题是什么类型的参数)。每次我用不同的名称调用 FOO 时,我都想获得 Bar 的不同实例化。 Bar 模板实际上并不需要能够在内部获取名称,我只需要确保不同的名称创建 Bar 的不同实例并且始终使用相同的名称(即使在不同的翻译单元中)获取 Bar 的同一个实例。所以这是一个粗略的第一次尝试:

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

#define FOO(name) Bar<#name>

这可行,除了 char 字面量不能作为模板参数传递,因为它们没有外部链接。如果预处理器中有某种​​方法可以得到一个一致的“名称”哈希,那么一个 int(然后可以传递给模板)就可以了,但我看不出有任何方法可以做到这一点。

想法?

【问题讨论】:

  • 你到底想做什么?
  • 对 C++ 语言的可笑滥用 ;) 这将成为即将发布的开源库的一部分,一旦发布,我将在此处发表评论,以便您查看 ;)
  • 这在 1.2 版中用于开源 Toast 库的 TOAST_STATIC_INIT_PROTECTED 实现中。文档链接:toast.sourceforge.net/…

标签: c++ templates c-preprocessor


【解决方案1】:

根据你打算在哪里使用这个宏(命名空间或类范围会起作用),你可以创建一个标签类型并使用它:

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

【讨论】:

  • 你的意思是template&lt;typename T&gt;
  • @bdonlan:嗯,是的,我只是复制了代码而没有真正考虑。对不起。会修复的。
  • 你先生,真是个天才 :) 这顺便解决了我的旧方法遇到的其他 3 个问题。
  • 在发布这篇文章时,我们的分数完全匹配,真是巧合。
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多