有没有办法在C ++中模拟元编程?

时间:2014-08-10 17:49:59

标签: python c++ metaprogramming

有没有办法在C ++中模拟元编程? (c ++不是c ++ 11标准) 对于堆栈上的Python建议(Generate specific names proeprties using metaclass)我创建类似的并且它可以工作

class FooMeta(type):
    def __init__(cls, name, bases, dct):
        super(FooMeta, cls).__init__(name, bases, dct)
        for n in range(100):
           setattr(cls, 'NUMBER_%s'%n, n)

class Bar(object):
    __metaclass__ = FooMeta

但我在C ++中也需要相同的类,带有n个静态const int NUMBER_some_number字段的类。 如何在没有硬编码的情况下创建它?

2 个答案:

答案 0 :(得分:3)

在Python命名中,前几百个整数可以有轻微的性能优势,因为一个典型的实现只缓存几百个整数,并且仍然可以查找它们。

在C ++中,整数不是动态对象,所以没有问题也没有优势。

在C ++中,元编程现在通常使用模板机制完成。在此之前介绍了一个用于生成代码的宏。但是,由于您要解决的Python问题在C ++中不存在,所以没有意义。

答案 1 :(得分:1)

As"干杯和hth。 - Alf"指出当你在c ++中做同样的事情时,没有性能提升。 此外,应该不惜一切代价避免使用真正绝对糟糕的风格。 这就像没有用c ++编程一样。

如果由于某种原因你仍然无法避免这样做,你可以使用Boost.Preprocessor

#include <boost/preprocessor/iteration/local.hpp>

#define BOOST_PP_LOCAL_MACRO(n) \
    static const int NUMBER_ ## n = n;

// NOTE the valid range you can iterate over has to be a subset of [0, BOOST_PP_LIMIT_ITERATION]
#define BOOST_PP_LOCAL_LIMITS (0, 99)

class Bar
{
    public:
#include BOOST_PP_LOCAL_ITERATE()
};

您可以在调用示例时看到扩展结果

g++ -E file.h

其中file.h是您放入代码的文件。

但有一点需要注意。像Boost.Preprocessor这样的东西不应该被过度使用,因为那样的风格也会很糟糕 宏可能非常有用,但我尽量避免使用它们。