提问人:confused cmake user 提问时间:11/14/2023 最后编辑:confused cmake user 更新时间:11/15/2023 访问量:62
C++ 函数指针和模板化参数与单独的模板一起使用
C++ function pointer and templated argument used with separate template
问:
我正在尝试将单个函数指针参数传递给一个函数,然后该函数使用该函数的参数作为函数模板的一个参数,并将实际函数指针用作另一个模板参数。
我正在尝试简化一些 entt 事件注册代码,但我遇到了障碍。 默认的 entt 代码如下所示
dispatcher.sink<Event>().connect<&Func>();
Event
非常基本,看起来像这样:
class Event
{
public:
std::string state;
};
Func
有一个定义,比如
void Func(const Event& event)
{
std::cout << "EVENT: " << event.state << '\n';
}
因为已经有,所以我认为我可以通过仅使用 Func 来简化此代码,但我不确定如何。Func
Event
我让它看起来像
registerEvent<Event, &OnEvent>();
跟
template <typename EventType, void(*fnPtr)(const EventType&)>
void registerEvent() {
dispatcher.sink<EventType>().template connect<fnPtr>();
}
但我希望让它变小,比如:
registerEvent<&OnEvent>();
或
registerEvent(&OnEvent);
这是包含所有代码的 godbolt 链接: https://godbolt.org/z/n3a5YKGhz
或在这里:
#include <vector>
#include <string>
#include <iostream>
#include "entt/entt.hpp"
static entt::dispatcher dispatcher;
template <typename EventType, void(*fnPtr)(const EventType&)>
void registerEvent() {
dispatcher.sink<EventType>().template connect<fnPtr>();
}
template <typename EventType>
void registerEventSmall(void(*fnPtr)(const EventType&)) {
dispatcher.sink<EventType>().template connect<fnPtr>();
}
class Event
{
public:
std::string state;
};
void OnEvent(const Event& event)
{
std::cout << "EVENT: " << event.state << '\n';
}
void OnEvent2(const Event& event)
{
std::cout << "EVENT 2: " << event.state << '\n';
}
int main()
{
Event event;
event.state = "something";
//Doesn't really simplify anything, still two template arugments
registerEvent<Event, &OnEvent2>();
//I want to convert to something like:
// registerEventSmall(&OnEvent);
// registerEventSmall<&OnEvent>();
//Trying to get to this
dispatcher.sink<Event>().connect<&OnEvent>();
dispatcher.trigger<Event>(std::move(event));
}
registerEventSmall 是我试图获得工作的函数,main 中的两个注释掉的函数是我试图实现的。
这可能吗? 如何实现简化?
答:
0赞
Jarod42
11/15/2023
#1
你可能会这样做
template <auto fnPtr>
void registerEventSmall() {
return []<typename EventType>(void(*)(const EventType&)){
registerEvent<EventType,fnPtr >();
}(fnPtr);
}
评论
Func
OnEvent