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

C++ function pointer and templated argument used with separate template

提问人:confused cmake user 提问时间:11/14/2023 最后编辑:confused cmake user 更新时间:11/15/2023 访问量:62

问:

我正在尝试将单个函数指针参数传递给一个函数,然后该函数使用该函数的参数作为函数模板的一个参数,并将实际函数指针用作另一个模板参数。

我正在尝试简化一些 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 来简化此代码,但我不确定如何。FuncEvent

我让它看起来像

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 中的两个注释掉的函数是我试图实现的。

这可能吗? 如何实现简化?

C++ 模板 参数

评论

3赞 Paul Sanders 11/14/2023
请创建一个最小的可重现示例,并在问题本身中包含所有相关的源代码。外部链接腐烂(甚至 Godbolt)。
0赞 confused cmake user 11/14/2023
@PaulSanders应该固定
0赞 Paul Sanders 11/14/2023
没有。我无法编译和运行此代码。
0赞 pptaszni 11/14/2023
stackoverflow.com/questions/28509273/......你需要这样的 sth 吗?
0赞 Ben Voigt 11/15/2023
和注定是一样的吗?FuncOnEvent

答:

0赞 Jarod42 11/15/2023 #1

你可能会这样做

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

演示