【发布时间】:2016-08-18 17:22:16
【问题描述】:
我在获取部分限定的函数对象以稍后在另一个线程中使用可变参数调用时遇到问题。
在 GCC 中,我一直在使用我制作的宏和 typedef,但我正在完成我的项目并尝试清除警告。
#define Function_Cast(func_ref) (SubscriptionFunction*) func_ref
typedef void(SubscriptionFunction(void*, std::shared_ptr<void>));
使用如下所示的 Function_Cast 宏会导致“警告:有条件地支持函数指针和对象指针之间的转换”
Subscriber* init_subscriber = new Subscriber(this, Function_Cast(&BaseLoaderStaticInit::init), false);
我真正需要的只是一个可以创建 std::bind
另外,这个有条件支持的东西真的很烦人。我知道在 x86 上我的代码可以正常工作,并且我知道依赖 sizeof(void*) == sizeof(this*) 来处理所有这些*的局限性。
另外,有没有办法让 clang 将函数指针视为数据指针,以便我的代码能够编译?我很想知道它失败的程度(如果失败的话)。
相关代码:
#define Function_Cast(func_ref) (SubscriptionFunction*) func_ref
typedef void(SubscriptionFunction(void*, std::shared_ptr<void>));
typedef void(CallTypeFunction(std::shared_ptr<void>));
Subscriber(void* owner, SubscriptionFunction* func, bool serialized = true) {
this->_owner = owner;
this->_serialized = serialized;
this->method = func;
call = std::bind(&Subscriber::_std_call, this, std::placeholders::_1);
}
void _std_call(std::shared_ptr<void> arg) { method(_owner, arg); }
【问题讨论】:
-
非静态成员函数不能用作指向(非成员)函数的普通指针。你有 C++11,为什么不使用
std::function和std::bind? -
@JoachimPileborg 我首先尝试使用 std::function,主要是因为名称,但我在将
std::function<void(Type1::this*, shared_ptr)>转换为std::function<void(void*, shared_ptr)>时遇到了问题,以便我可以存储很多它们在相同的结构中。回答此转换也将是对问题的回答。 -
@lorro 我没有尝试过 lambda,因为它们似乎必须使用捕获子句中的已知参数构造,而我需要传递未知的 shared_ptr
。另外,我可以在同一个类向量结构中存储不同的 lambda 表达式吗? -
只是一个观察,但需要指向
void的指针通常是设计问题的标志。类型安全是 C++ 的优点之一。积极尝试绕过它最终意味着代码的新读者更难维护和掌握更糟糕的代码(对于“新读者”,当你开始忘记几个月时,我包括你自己详情)。 -
@JoachimPileborg 感谢您的关注,但(据我所知)这是少数必须以 void* 形式进行存储的情况之一。我在上面编写了一个 typedef,它允许编译器强制执行函数声明。如果您可以将不同类的函数对象存储在同一个容器中,那么我很乐意改用它。另外,我不是“新读者”。这个问题源于一个类似于英特尔 TBB 的项目的 sn-p,但几乎是全自动的,并且是未来提交给 SC 会议的主要代码。
标签: c++ pointers c++14 clang++ c++17