c++ - C ++模板类型循环和指向模板实例的非模板指针
问题描述
作为参考,这里是最小的例子:http ://coliru.stacked-crooked.com/a/75354688a0a6af64
在这个例子中,我有一个模板类型循环的问题,在我看来,可以通过两种方式解决:
- 使
Controller
模板类和Event
成员指针成为指向模板类实例的非模板指针(但是如何?) - 使用
std::any
或类似的东西来保持Controller
类非模板(如示例中所示,但不编译)
使这项工作干净利落的最佳方法是什么?
编辑:链接更新
解决方案
您不能完全键入接受模板参数的擦除函子。
但是,如果您知道要处理的模板参数的子集,std::any
/std::variant
可能会有所帮助:
在您的情况下,不受支持的事件不执行任何操作,因此“您的”控制器:
template <typename ... Modules>
class Controller {
public:
std::tuple<Modules...> modules;
template<typename evt_t>
void emit(evt_t event) {
std::apply([this](auto&&... args) {((args.dispatch(Event<evt_t>{event, this})), ...);}, modules);
}
Controller(std::tuple<Modules...> _modules) : modules{_modules}{}
};
变成
class Controller {
std::function<void(std::any)> func;
public:
template<typename evt_t>
void emit(evt_t event) {
func(event);
}
template <typename ... Modules, typename EventTags>
Controller(std::tuple<Modules...> tmodules, EventTags event_tags)
{
func = [=, this](std::any any_ev){
auto f = [&, this](auto tag){
using EventType = typename decltype(tag)::type;
if (auto* ev = std::any_cast<EventType>(&any_ev)) {
std::apply([=, this](auto&&... modules) {((modules.dispatch(Event<EventType>{*ev, this})), ...);}, tmodules);
}
};
std::apply([&f](auto... tags){ (f(tags), ...); }, event_tags);
};
}
};
推荐阅读
- angular - 离子应用程序无法在 android 版本 4.4.2 kitkat 中运行
- asynchronous - 如何按顺序执行异步函数的动态列表?
- go - 在 Golang 中阅读 BigQuery。并未给出所有预期结果。该怎么办?
- python - 将 json 文件转换为包含所有嵌套对象矩阵的多行
- python - 如何克服 Firefox 提示保存文件
- powerbi - Power BI Embedded - Javascript API 和筛选
- nomad - 有没有办法用 nomad 将任务分配给特定节点?
- visual-studio - 跨共享计算机缺少数据
- android - 在 Android 运行时从 xml 文件设置视图
- ios - 如何根据商店为我的应用程序使用不同的名称