我知道"C++代表"的主题已经完成,而http://www.codeproject.com和http://stackoverflow.com都深深地涵盖了这个问题.
一般来说,似乎Don Clugston最快的代表是许多人的首选.还有一些其他流行的.
但是,我注意到这些文章中的大多数都是旧的(大约在2005年),并且许多设计选择似乎都是考虑到VC7之类的旧编译器.
我需要一个非常快速的代理实现音频应用程序.
我仍然需要它可移植(Windows,Mac,Linux),但我只使用现代编译器(VC9,VS2008 SP1和GCC 4.5.x中的编译器).
我的主要标准是:
此外,我真的不需要异国情调的功能.我只需要一个好的旧指针到方法的东西.无需支持静态方法,自由函数或类似的东西.
截至今天,推荐的方法是什么?仍然使用唐的版本?或者是否存在关于另一种选择的"社区共识"?
我真的不想使用Boost.signal/signal2,因为它在性能方面是不可接受的.对QT的依赖也是不可接受的.
此外,我在google搜索时看到了一些较新的库,例如cpp-events,但我找不到任何来自用户的反馈,包括SO.
有没有人知道是否可以像没有记录器一样的类:
使用单例或全局(la std :: cout)
将实例/指针/引用传递给需要它的每个方法
我以一个记录器类为例,但我的应用程序中有一些类可以从中受益(例如,撤消管理器).
每个解决方案都有几个问题:
使用单例对于测试来说是有问题的(还有许多原因,使用单例通常不是一个好主意).全球化也是如此.此外,没有什么可以保证应用程序中只有一个实例,甚至不是一个要求(例如,为什么没有2个记录器?)
将它传递给每个对象构造函数(依赖注入),导致很多样板代码,并且可能容易出错,因为你必须多次复制/粘贴相同的代码.可以认真考虑在每个类的构造函数中都有一个指向Logger的指针???????
所以我想知道是否有第三种选择,在C++中,我从未听说过?对我而言,听起来它需要一些黑魔法引擎盖,但我对我在堆栈溢出中学到的一些技术感到惊喜,这是我在google中找不到的,所以我知道这里有一些真正的大师;)
令人惊讶的是,我发现了许多关于如何设计单身人士的讨论,或者为什么不应该使用单身人士,但我找不到一个解决我的问题的帖子......
我一直在阅读Alexandrescu的书,现代C++设计,我对他使用的技术印象深刻,所以我想在我的应用程序中添加Loki库.
然而,经过进一步的调查,我看到我已经在使用的提升提供了很多类似的功能(不是全部,但是,例如,我无法在boost中找到单例)
由于基于策略的设计和仿函数,我最感兴趣的是使用loki.
对我而言,boost和loki都有利有弊.我对loki的主要关注是糟糕的文档(图书馆不再与书籍联系在一起了)但在我看来,loki比某些领域的提升更强大,更灵活(我可能错了)
在选择使用boost或loki作为仿函数和策略之前,我想知道在现实生活中使用它们的人的意见.
有时在纸上看起来非常好但是当你真正使用它们时会有一些缺点:)
我正在尝试实现命令设计模式,但我遇到了一个概念问题.假设您有一个基类和一些子类,如下例所示:
class Command : public boost::noncopyable {
virtual ResultType operator()()=0;
//Restores the model state as it was before command's execution.
virtual void undo()=0;
//Registers this command on the command stack.
void register();
};
class SomeCommand : public Command {
virtual ResultType operator()(); // Implementation doesn't really matter here
virtual void undo(); // Same
};
Run Code Online (Sandbox Code Playgroud)
问题是,每次()在SomeCommand实例上调用操作符时,我都想通过调用Command的register方法将*this添加到堆栈中(主要用于撤消).我想避免从SomeCommand :: operator()()调用"register",但要将它命名为automaticaly(someway ;-))
我知道当你构造一个像SomeCommand这样的子类时,基类构造函数被称为automaticaly,所以我可以在那里添加一个"register"调用.在调用operator()()之前,我不想调用它.
我怎样才能做到这一点?我想我的设计有些缺陷,但我真的不知道如何使这项工作.
我正在浏览Boost中的"Function"类文档,并偶然发现:
boost::function<float (int x, int y)> f;
Run Code Online (Sandbox Code Playgroud)
我必须承认这种语法对我来说非常困惑.这怎么可能是合法的C++?
引擎盖下有什么伎俩吗?这种语法记录在何处?
好的,我们走了.我正在尝试使用CRTP模板,以便从我的应用程序中删除多态性的需要.我使用像下面那样的方法
template <RealType> class Base
{
void doSomething()
{
static_cast<RealType>(this)->doSomethingImpl()
}
class Derived1 : public Base
{
void doSomethingImpl()
{
/* do something, for real */
}
}
class Derived2 : public Base
{
void doSomethingImpl()
{
/* do something else */
}
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,这个方法允许我的类没有vtable,所以函数调用是直接的,不需要额外的间接.
现在假设我想将所有Derived#类存储在容器中.让我们说一个向量.
第一种方法:我可以创建一个非模板SuperBase类,Base从该类继承并将其存储在容器中.
然而,在我看来,如果我想这样做,我将不得不在SuperBase中使doSomething虚拟化.我的目标主要是没有vtable.
第二种方法:我使用类型擦除,即boost :: any之类的东西将我的元素存储在Vector中.但是,我没有看到我可以迭代元素并在它们上调用doSomething的方法,因为要"使用"boost :: any,我需要在迭代时知道对象的真实类型.
你认为我想要做的甚至是可能的吗?
在我看来,这是因为doSomething()是Base的一部分,但除了使用继承之外,我看不到这样做的方法....
我使用经过检查的STL实现在我的代码中有意外的断言故障.
经过一些研究后,我将问题缩小到一个向量中的push_back,该向量来自与创建向量的线程不同的线程.
重现此问题的最简单代码是:
class SomeClass
{
private:
std::vector<int> theVector;
public:
SomeClass ()
{
theVector.push_back(1); // Ok
}
void add()
{
theVector.push_back(1); // Crash
}
};
Run Code Online (Sandbox Code Playgroud)
唯一的区别是SomeClass是从我的主线程实现的,而add是从另一个线程调用的.然而,没有一个简洁的问题:在我用于排除故障的最简单的代码形式中,除了我上面提到的情况之外,没有人从这个向量中读取或写入.
跟踪push_back代码,我注意到std :: vector中的一些方法如count()或size()返回垃圾,当从另一个thred(方法"add")调用时,从创建线程调用时返回正确的值(例如在构造函数中)
我应该得出结论,std :: vector在多线程环境中不可用吗?或者是否有解决此问题的方法?
编辑:删除volatile
编辑2:你认为这个问题可能不在于多线程吗?在我的测试运行中,add只被调用一次(使用断点验证).如果我从构造函数中删除push_back,我仍然会崩溃.所以最后,即使只调用一个向量的方法,在一次调用的函数中也会使断言失败.因此,不能有可靠性,或......?
我想知道一个类似队列的容器,但它具有密钥访问权限,就像地图一样.我的目标很简单:我想要一个FIFO队列,但是,如果我插入一个元素并且一个给定键的元素已经在队列中,我希望它新的元素替换已经在队列中的元素.例如,按插入时间排序的地图将起作用.
如果没有这样的容器,你认为它可以通过同时使用队列和地图来实现吗?
我想配置 VS2015 调试器,以便当我进入某些代码 (F11) 时,它会逐步执行某些功能。
例如,假设有一个模板类 SmartPointer,它有一个重载成员 -> 。
如果我有以下声明:
SmartPointer<SomeClass> ptr;
/* initialize ptr */
ptr->method();
Run Code Online (Sandbox Code Playgroud)
调试器将进入SmartPointer::operator->,退出,然后进入方法()。我想直接进入method()。
这可能吗 ?
编辑:所谓的重复不是一个,因为它不适用于 vs2013 或 2015
来自谷歌:
例如,我们使用名为“ SID”和“ HSID”的cookie,其中包含用户的Google帐户ID和最近登录时间的数字签名和加密记录。这两个Cookie的组合使我们能够阻止许多类型的攻击,例如尝试窃取您在网页上填写的表单内容。
我不太明白最后一句话。如何保持帐户ID免受攻击?是不是反过来了?像用户每次都要登录才能使服务100%安全吗?
c++ ×9
boost ×3
functor ×2
stl ×2
base-class ×1
class ×1
containers ×1
cookies ×1
delegates ×1
logging ×1
loki ×1
methods ×1
performance ×1
singleton ×1
type-erasure ×1
vector ×1