C++函数指针和模板化参数与单独的模板一起使用

polkgigr  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(121)

我尝试将单个函数指针参数传递给一个函数,然后该函数将该函数的参数用作函数模板的一个参数,并将实际函数指针用作另一个模板参数。
我试图简化一些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已经有了Event,我想我可以通过使用Func来简化这段代码,但我不确定如何做到。
我把它弄得像

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中的两个注解掉的函数是我试图实现的。
这可能吗?我怎样才能实现简化?

kr98yfug

kr98yfug1#

你可能会做

template <auto fnPtr>
void registerEventSmall() {
    return []<typename EventType>(void(*)(const EventType&)){
        registerEvent<EventType,fnPtr >();
    }(fnPtr);
}

字符串
Demo

相关问题