【发布时间】:2018-01-01 08:00:22
【问题描述】:
我正在尝试创建一个类似于 c# 系统的 c++ 事件系统。 我需要能够存储任何类型的函数并在适当的时候使用正确的参数调用它们。
我能得到的最接近的是 std::function、bind 和占位符,但这是我的问题。
void Func()
{
std::cout << "Notified" << std::endl;
}
void FuncWithParam(const std::string& str)
{
std::cout << str << std::endl;
}
std::function<void()> fn = std::bind(Func); // this works
std::function<void()> fn = std::bind(FuncWithParam, "Hello there"); // this works also
std::function<void()> fn = std::bind(FuncWithParam, _1); // but this doesn't
真的可以在单个 std::function 中存储任何类型的签名吗?还是我必须求助于更复杂的解决方案。
【问题讨论】:
-
不是任何一种,不。您在模板参数中指定一个签名。可转换性使类型可以协商,但函数参数的数量是固定的。
-
可以构建这样的东西,但问题仍然是,当您可以将任何可调用对象放入其中时,您如何知道您正确调用了它?也许您正在寻找类似type-safe heterogeneous event system 的东西。
-
我希望不使用 Boost,但您的回答实际上为我正在尝试做的事情命名。这应该让我继续前进
-
FWIW,Hana 在加入 Boost 之前是独立存在的。完全可以在没有 Boost 的情况下使用它。
-
哦,这不仅仅是关于 Boost。我希望能够在不使用任何外部依赖项的情况下解决这个问题。但如果需要,我肯定会尝试 Hana 甚至 Boost::Signal。
标签: c++ c++11 events std-function stdbind