随机类的宏
Macros for random classes
本文关键字:随机 更新时间:2023-10-16
我有一个有几个子类的父类,并将添加一个函数,该函数随机生成并返回指向其中一个子类的指针。例如,
class Parent { ... }
class Child1 : public Parent {...}
class Child2 : public Parent {...}
...
class ChildN : public Parent {...}
// returns one of the children, randomly
Parent* generate_random();
一方面,我可以编写generate_random
硬编码子类的数量,并在每次添加Parent的新子类或删除旧子类时更新此数量。但这似乎有点脆弱。类似地,我甚至可以使用const变量来跟踪子类的数量。同样,每当添加和删除类时,我都必须手动更新此表。这看起来也很脆弱。
相反,在像Python这样的语言中,我可以在Parent的每个子类的声明之上放置一个装饰器,它将增加所有子类的计数并使用它。例如:
_num_subclasses = 0
def _register_subclass(cls):
global _num_subclasses
_num_subclasses += 1
class Parent(object):
...
@_register_subclass
class Child1 (Parent):
...
@_register_subclass
class Child2 (Parent):
...
...
是否有一种方法可以使用预处理器做类似的事情?或者是否有一种方法可以在类声明之前或之后运行方法一次且仅一次?(如果我不仅可以为每个类增加一个计数器,还可以在单例映射中为它注册一个工厂,那就太好了。)或者,更一般地说,其他人是如何处理这类问题的?如果我的问题中有不清楚的地方或需要重新措辞,请告诉我。
我对python一窍不通,但让我们检查一下:
_num_subclasses = 0
def _register_subclass(cls):
global _num_subclasses
_num_subclasses += 1
@_register_subclass
class Child1 (Parent):
转换成c++ (ish)
int _num_subclasses = 0;
template<class cls>
bool _register_subclass() {
_num_subclasses += 1;
return true;
}
class Child1 : public Parent {
};
static const bool register1 = _register_subclass<Child1>();
但是,通常需要一个类型列表。通常像这样:
typedef std::unique_ptr<Parent*> ParentPointer;
//an enum is recommended, but type_id can work, depending on what you're doing
std::unordered_map<std::type_info, std::function<ParentPointer()>> _subclass_generator;
template<class cls>
bool _register_subclass() {
_subclass_generator[typeid(cls)] =
[]()->ParentPointer{
return ParentPointer(new cls{});
};
return true;
}
class Child1 : public Parent {
};
static const bool register1 = _register_subclass<Child1>();
然后可以使用_subclass_generator
int selection = std::rand() % _subclass_generator.size();
auto& generator = *std::advance(_subclass_generator.begin(), selection);
ParentPointer ptr = generator(); //generates a Child.
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- GCC:随机构建导致执行期间分段错误
- 如何使用 SML 随机生成八进制元组
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 将正态随机变量与任意 RHO(corrcoef) 相关联