- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试构建一个通用的推送组件。
我有一个类store<T>
哪个
void push(const T & t)
数据提供者调用的方法。当提供者调用推送时,我想要一个由 std::function< T2(const T&)>
计算的值并通知所有客户(store<T2>
)具有 T2 类型的结果值。商店客户必须首先通过 linker<T, T2>
订阅商店对象。
template <class data> class store
{
data data_;
std::list< action<data > > m_links;
public:
void push(const data & e)
{
data_ = e;
for(action<data> a : m_links)
a(data_);
}
void subscribe(action<data> d)
{
m_links.push_back(d);
}
};
链接器对象:
template < class data1, class data2 > class linker
{
// source where come the push calls
store<data1> & m_source;
// targets to be notified after computation
std::list<store<data2> * > m_targets;
// computation function
std::function< data2(const data1 &)> m_func;
public:
linker(store<data1> & source, std::function< data2(const data1 &)> func)
: m_source(source), m_func(func)
{
m_source.subscribe([this](const data1 & d){this->push(d);});
}
// add a client
void add_target(store<data2> & target)
{
m_targets.push_back(&target);
}
void push(const data1 & e)
{
//compute result
data2 d2 = m_func(e);
// notify all
for(store<data2> * s2 : m_targets)
{
s2->push(d2);
}
}
};
用例:
int main()
{
// function : just increment an int, return as double
std::function<double(const int &) > f_inc = [](const int& i){ return i+1;};
// function : display the data
std::function<int(const double&) > f_display = [](const double& d){ std::cout << "value=" << d << std::endl ; return 0;};
store<int> source;
store<double> target, target2;
linker<int, double> l(source, f_inc);
l.add_target(target);
l.add_target(target2);
linker<double, int> display(target, f_display);
source.push(1);
return 0;
}
我想抑制“链接器”对象的显式性。我没有成功,因为我不知道如何处理这样一个事实,即当商店客户端订阅商店对象时,该对象无法存储要存储的指针,因为它不知道类型 T2 !
我想写这样的东西:
std::function<double(const int &) > f_inc = [](const int& i){ return i+1;};
store<int> source;
store<double> target;
source.link_to(target, f_inc);
并且能够取消订阅:
source.unlink(target, f_inc);
或带有 ids:
id i = source.link_to(target, f_inc);
source.unsubscribe(i);
我在 windows xp 下使用 codeblocks + mingw 4.8.1。我想这个用例存在设计模式......
ps:我不能用boost。
最佳答案
在我看来,明确性是指 Linker
具有模板参数这一事实。
我设想的是这样的:
class Broker {
public:
Broker(): _lastId(0) {}
//
// Notification
//
template <typename T>
void notify(store<T> const& source, T const& event) {
auto const it = _sources.find(&source);
if (it == _sources.end()) { return; }
for (size_t id: it->second) { _targets.find(id)->second->invoke(&event); }
} // notify
//
// Subscription
//
template <typename T, typename U>
size_t subscribe(Store<T> const& source, U&& callback) {
_targets[++_lastId] = std::unique_ptr<Action>(new ActionT<T>(callback));
_sources[&source].insert(_lastId);
return _lastId;
} // subscribe
template <typename T, typename U>
size_t subscribe(Store<T> const& source, U const& callback) {
return this->subscribe(source, U{callback});
} // subscribe
void unsubscribe(size_t id) {
auto const it = _targets.find(id);
if (it == _targets.end()) { return; }
void const* source = it->second->_source;
auto const it2 = _sources.find(source);
assert(it != _sources.end());
it2->second.erase(id);
if (it2->second.empty()) { _sources.erase(it2); }
_targets.erase(it);
} // unsubscribe
template <typename T>
void unsubscribe(store<T> const& source) {
auto const it = _sources.find(&source);
if (it == _sources.end()) { return; }
for (size_t id: it->second) { _targets.erase(id); }
_sources.erase(it);
} // unsubscribe
private:
//
// Action/ActionT<T> perform Type Erasure (here, we erase T)
//
struct Action {
Action(void const* source): _source(source) {}
virtual void invoke(void const*) = 0;
void const* _source;
}; // struct Action
template <typename T>
class ActionT: Action {
public:
ActionT(store<T> const& source, std::function<void(T)> f):
Action(&source),
_callback(std::move(f))
{}
virtual void invoke(void const* event) {
_callback(T(*static_cast<T const*>(event));
}
private:
std::function<void(T)> _callback;
}; // class ActionT
using Targets = std::map<size_t, std::unique_ptr<Action>>;
using Sources = std::map<void const*, std::set<size_t>>;
size_t _lastId;
Targets _targets;
Sources _sources;
}; // class Broker
如您所见,相当复杂……而且最糟糕的是什么?它仍然不安全。具体来说,存在生命周期问题:
有一些方法可以解决这个问题,您可能需要查看 signal/slots这有助于在不将其绑定(bind)到特定对象的情况下实现此逻辑。
关于c++11:通过 std::function<T(const U&)> 推送泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216866/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!