gpt4 book ai didi

c++ - C++11 中的泛型函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:18 24 4
gpt4 key购买 nike

我目前正在用 C++x0 编写一个方法执行队列。我已经实现并验证了基本的队列机制,但想用一个选项来修改它,让 push() 自动删除所有以前对特定方法的调用:

queue.push(this, &Obj::foo, 1);
queue.push(this, &Obj::foo, 2);
queue.push(this, &Obj::foo, 3);

应该和调用一样

queue.push(this, &Obj::foo, 3);

到目前为止,我的代码如下所示:

队列.h:

#pragma once

#include <functional>
#include <vector>

using std::vector;
using std::function;
using std::bind;

class Queue
{

private:
struct functioncall {
std::function<void()> call;
};

vector<functioncall> queue;

public:
Queue();
~Queue();

template<typename T, typename F, typename... Args>
int push(T, F , Args... args);

int pop();
bool empty();
size_t size();
};


template<typename T, typename F, typename... Args>
int Queue::push(T instance, F func, Args... args)
{
functioncall newelem = { bind(func, instance, args...) };
queue.push_back(newelem);
return queue.size();
}

队列.cpp:

#include "Queue.h"

Queue::Queue() : queue()
{
}

Queue::~Queue()
{
delete &queue;
}

int Queue::pop()
{
if(!queue.empty())
{
queue.front().call();
queue.erase(queue.begin());
return queue.size();
}
return 0;
}

bool Queue::empty()
{
return queue.empty();
}

size_t Queue::size()
{
return queue.size();
}

我已经准备好 vector queue 来获取一个结构,我不仅要保存 std::bind 的结果,还要保存指向该方法的指针被调用以便我可以查找该指针并删除旧条目。

问题是传递给 push() 的函数可以接受任意数量的参数。是否有通用指针类型(它不一定是可执行的,只要在我重复将相同的函数推送到队列时相同)就可以做到这一点?

最佳答案

根据 5.2.10p10,您可以将一个指向成员函数 T::*(A1, A2, ...) 的指针转换为另一个指向成员函数类型 U::* 的指针(B1, ...) 并在不丢失信息的情况下返回; std::less 可以比较指向成员函数的指针,因此通过转换为一个虚拟的成员指针类型 void (Impl::*)() 你可以比较指针具有相同签名的成员函数。

但是,不能保证指向具有不同签名的成员函数的指针在转换为相同的指向成员类型的指针时会比较不同,因此您需要将签名编码为您的可比较类型。 typeid 将在这里工作:

auto key = std::make_pair(&typeid(F), reinterpret_cast<void (Queue::*)()>(func));

这假设 F 确实是指向成员函数的指针;如果用户试图传递其他一些可调用对象,那么这将中断。

关于c++ - C++11 中的泛型函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com