【问题标题】:Macro with some sort of condition具有某种条件的宏
【发布时间】:2010-12-23 17:41:55
【问题描述】:

我正在尝试创建一个宏,让我免于打字,并让定义属性变得更好/更容易,这就是我的想法:

#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \

其中 Access 是一个具有三个可能值的枚举:ReadOnly、WriteOnly 和 ReadWrite。只有在访问值适合该方法时,才应定义宏中的方法。

这是否有可能,例如使用元编程?

【问题讨论】:

  • 没有宏元编程之类的东西。您可能需要在此处进行部分模板专业化。此外,使用一种构造,有时定义方法,有时不使用是相当棘手的。你真正想要完成什么?如果你有足够多的 getter 和 setter 使用来简化编写它们,那么你几乎肯定会写出糟糕的 O-O。
  • @David - 你对此可能大错特错。参见 boost.preprocessor
  • @Noah:谢谢。有这样的事情。我更高兴不知道。
  • 这很不幸。这是一个非常强大且重要的库。
  • @David:我正在努力完成我向您展示的内容。更容易定义属性。是的,我需要它们,不,这还不错哦。我经常使用 c#,并且非常喜欢属性的工作方式。所以我也想在 C++ 中做同样的事情。

标签: c++ macros c-preprocessor metaprogramming


【解决方案1】:

是的,你可以很容易地做到这一点:

#define DefineGetReadOnly(Name, Type)  Type Get##Name();
#define DefineGetReadWrite(Name, Type) Type Get##Name();
#define DefineGetWriteOnly(Name, Type)

#define DefineProperty(Access, Type, Name) \
    DefineGet##Access(Name, Type)

宏替换发生如下:

DefineProperty(ReadOnly, int, Foo)
DefineGetReadOnly(Foo, int)
int GetFoo();

DefineProperty(WriteOnly, int, Bar)
DefineGetWriteOnly(Bar, int)
/* no tokens */

【讨论】:

  • @Stacked:是的,一切都是为了使用正确的工具来完成这项工作。当您需要自动生成代码时,宏通常是语言中内置的最佳工具。
  • 这确实相当简单和干净(而不是元编程)。不知道您可以在宏中包含宏,甚至可以像您那样命名它们。非常好。
【解决方案2】:

嗯,McNellis 的回答相当简单明了。但是,如果您有兴趣,也很有可能在使用模板元编程之后准确地构建您想要的东西。去年我一直在完善一个库来做到这一点。

我不能全部分享,它是专有的,不归我所有。但我可以为您指出我认为最容易使用的方向。查看 Abrahams 和 Gurtovoy 在 C++ Template Metaprogramming 的 9.5 中描述的技术。将其与 boost::tuple 和 boost::fusion 对象进行比较。请注意,您可以通过定义新类型来声明“名称”。因此,您可以像这样创建您可能使用的东西:

struct object_with_properties : construct_property_object< mpl::vector< mpl::pair< property<access,type>, name> ... > >::type
{};

object_with_properties owp;
get<name>(owp);
set<name>(owp, value);

// or maybe
get<name>(owp) = value;

我的系统实际上允许您定义这些属性由函数实现的对象。虽然它要复杂得多,但我还没有找到将其简化到上述程度的方法。为此,我从一篇名为“通过模板元编程的反射支持”的文章开始,该文章在网上某处......可能已从 ACM 中删除。

【讨论】:

  • 感谢您的回复,我实际上对此很感兴趣,但我现在选择 James 指出的更清洁/更简单的方法。我需要花点时间去拿那本书,了解更多关于元编程的知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2014-01-16
  • 2016-07-15
  • 2018-09-15
  • 1970-01-01
  • 2016-02-03
  • 2018-07-15
相关资源
最近更新 更多