Tag: c ++ 11

编译器错误C3493:'func'不能隐式捕获,因为没有指定默认捕获模式

你能帮我解决这个编译器错误吗? template<class T> static void ComputeGenericDropCount(function<void(Npc *, int)> func) { T::ForEach([](T *what) { Npc *npc = Npc::Find(what->sourceId); if(npc) func(npc, what->itemCount); // <<<<<<< ERROR HERE // Error 1 error C3493: 'func' cannot be implicitly captured because no default capture mode has been specified }); } static void PreComputeNStar() { // … ComputeGenericDropCount<DropSkinningNpcCount>([](Npc *npc, int i) { […]

获得时间以来,以毫秒为单位,最好使用C ++ 11 chrono

我想要的只是从毫秒到纪元的时间,并把它存储在一个无符号的长整数。 我发现这个相关的问题 。 但说实话,这不是执行如此简单任务的最简单的方法,是吗? 我希望有更简单的东西,但在std :: chrono引用中找不到任何东西。 任何build议是最受欢迎的。 我不一定要使用std::chrono ,但我希望它是平台独立的。

std :: map如何提供一个常量size()操作?

我知道所有的容器提供了一个恒定的size()操作,除了forward_list 。 但是如何map ,其内部数据结构是红黑树,提供了size()的复杂度? 像vector和string的其他人一样。 他们使用柜台吗? 如果是这样,为什么不forward_list ? 当我读这本书的C ++标准库时,我感到困惑:一个教程和参考 。

尝试使用dynamic_cast时获取“源types不是多态”

struct A {}; struct B : A {}; int main() { A* a = new B(); B* b = dynamic_cast<B*>(a); } 得到: 不能dynamic_cast'a'(types'struct A *')键入'struct B *'(源types不是多态) 我怎样才能使多态? 我想把它安全地扔到B. (一种方法是添加虚拟虚拟function,但有没有更好的方法?)

C ++ 11个可变数量的参数,相同的特定types

问题很简单,我将如何实现一个采用可变数量参数的函数(类似于可变参数模板),但是所有参数都具有相同的types,比如int。 我在想这件事情, void func(int… Arguments) 或者不会对types工作recursion静态断言?

为什么C ++中的types别名在其语法中使用“using”而不是“typedef”?

显然,input别名和模板types别名在语义上等同于typedefs和typedefs的扩展以支持模板。 如何using关键字创build新的语法,而不是使用typedef作为typedef的第一个和一些语法扩展。 注意:这不是“使用和typedef之间的区别”问题的克隆。 我知道using定义了一个typedef的家庭的优势。 我所问的是为什么标准人员决定让这个扩展名使用using关键字而不是typedef关键字。 这似乎只是增加了语言的混乱。

C ++ std :: unique_ptr:为什么lambdas没有任何大小的费用?

我正在阅读“Effective Modern C ++”。 在与std::unique_ptr相关的项目中,声明如果定制删除器是一个无状态对象,则不会发生大小的费用,但是如果它是一个函数指针或std::function大小的费用发生。 你能解释一下为什么? 假设我们有以下代码: auto deleter_ = [](int *p) { doSth(p); delete p; }; std::unique_ptr<int, decltype(deleter_)> up(new int, deleter_); 据我的理解, unique_ptr应该有一个types为decltype(deleter_)的对象,并为该内部对象分配deleter_ 。 但显然这不是发生了什么事情。 你可以用最小的代码示例来解释这个机制吗?

使用std :: forward和std :: move

我总是读std::forward只能用于模板参数。 但是,我在问自己为什么。 看下面的例子: void ImageView::setImage(const Image& image){ _image = image; } void ImageView::setImage(Image&& image){ _image = std::move(image); } 这两个function基本上是一样的; 一个采取一个l值参考,另一个r值参考。 现在,我认为自从std::forward应该返回一个l值引用,如果参数是一个l值引用和一个r值引用,如果参数是一个,这个代码可以简化为这样的: void ImageView::setImage(Image&& image){ _image = std::forward(image); } 这是类似的例子cplusplus.com提到了std::forward (只是没有任何模板参数)。 我只想知道,如果这是正确的,或者不是,为什么。 我也在问自己究竟会有什么不同 void ImageView::setImage(Image& image){ _image = std::forward(image); }

初始化std :: atomic_bool?

我想使用std::atomic_bool因为我想有一个布尔值,应该由不同的线程访问。 这是一个static成员variables。 问题是我想用false作为第一个状态初始化它。 通常我会这样做: std::atomic_bool World::mStopEvent = false; 但是问题似乎是它不会把构造函数当作false的。 那么我应该如何初始化这样一个variables呢? 我正在使用VS 2012。

模板化的typedef?

我正在使用libgc,C和C ++的垃圾收集器。 要使STL容器垃圾收集,必须使用gc_allocator。 而不是写作 std::vector<MyType> 一个必须写 std::vector<MyType,gc_allocator<MyType> > 有没有办法来定义类似的东西? template<class T> typedef std::vector<T,gc_allocator<T> > gc_vector<T>; 我前一阵子检查,发现这是不可能的。 但是我可能错了,或者可能有其他的方法。 用这种方式定义地图特别令人不快。 std::map<Key,Val> 变 std::map<Key,Val, std::less<Key>, gc_allocator< std::pair<const Key, Val> > > 编辑:在尝试使用macros后,我发现下面的代码打破了它: #define gc_vector(T) std::vector<T, gc_allocator<T> > typedef gc_vector( std::pair< int, float > ) MyVector; 模板types定义中的逗号被解释为macros参数分隔符。 所以看起来,内部类/结构是最好的解决scheme。 这里是一个关于如何在C ++ 0X中完成的例子 // standard vector using my allocator template<class T> […]