有没有办法在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字段的类。 如何在没有硬编码的情况下创建它?
答案 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这样的东西不应该被过度使用,因为那样的风格也会很糟糕 宏可能非常有用,但我尽量避免使用它们。