Tag: c ++ 11

与C ++中的普通指针相比,智能指针的开销是多less?

与C ++ 11中的普通指针相比,智能指针的开销是多less? 换句话说,如果我使用智能指针,我的代码会变慢,如果是这样,慢多less? 具体来说,我问的是C ++ 11 std::shared_ptr和std::unique_ptr 。 显然,按下堆栈的东西会更大(至less我是这么认为的),因为一个智能指针还需要存储其内部状态(引用计数等),问题实际上是,这是多less影响我的performance,如果有的话? 例如,我从一个函数而不是一个普通的指针返回一个智能指针: std::shared_ptr<const Value> getValue(); // versus const Value *getValue(); 或者,例如,当我的一个函数接受一个智能指针作为参数,而不是一个正常的指针: void setValue(std::shared_ptr<const Value> val); // versus void setValue(const Value *val);

在C ++中的string中的NUL char

在下面的代码中,我试图用'\0'replace第一个字符。 我期望它打印一个空string,但在输出中,它只是省略,并显示其余的字符。 int main() { string str; cin >> str; str[0] = '\0'; cout << str << "\n"; return 0; } 输出: testing esting 如何在C ++中终止string? PS:我正在试图终止string在另一个问题,我需要终止之间的方法。

位数:预处理器魔法vs现代C ++

假设我想为16位块中的64位整数创build编译时构造的位计数查找表。 我知道这样做的唯一方法是下面的代码: #define B4(n) n, n + 1, n + 1, n + 2 #define B6(n) B4(n), B4(n + 1), B4(n + 1), B4(n + 2) #define B8(n) B6(n), B6(n + 1), B6(n + 1), B6(n + 2) #define B10(n) B8(n), B8(n + 1), B8(n + 1), B8(n + 2) #define B12(n) B10(n), B10(n + […]

与任何types的参数匹配的C ++ variadic模板模板参数

我想知道是否有可能写一个模板函数,可以采取任何其他任意模板作为参数,并正确匹配模板名称(即不只是结果类)。 我所知道的工作是这样的: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); 这将匹配例如f(std::vector<int>())或f(std::list<int>())但不会为f(std::array<int, 3>()) ,因为第二个参数是size_t而没有types。 现在我想可以做一些疯狂的事情: template<template<typename …> class TemplateT, size… Sizes, typename… TemplateP> void f(const TemplateT<Sizes…, TemplateP…>& param); 希望编译器能正确地派生TemplateP省略号或Sizes省略号为空。 但是,这不仅丑陋,而且还适用于采用type或size_t参数的模板。 它仍然不会匹配例如与bool参数的任意模板。 重载方法也是如此: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); template<template<typename …> class TemplateT, size… Sizes> void f(const TemplateT<Sizes…>& param); 此外,如果我们想要混合size_t和typenames ,这种方法不会工作。 […]

为什么GCC -O3在filter迭代器上通过std :: deque产生无限的std :: distance?

经过很多的痛苦和苦难之后,我跟踪了一些非常奇怪的行为,当std::distance在给定范围的boost::filter_iterator时, std::distance永远不会返回std::deque 。 看来这个问题对于使用-O3优化的GCC(6.1+)来说是独一无二的。 这是一个certificate违规行为的例子: #include <string> #include <deque> #include <iterator> #include <iostream> #include <boost/iterator/filter_iterator.hpp> struct Foo { std::string bar, s = ""; char a = '\0'; }; int main() { const std::deque<Foo> foos(14, {""}); const std::string test {}; const auto p = [test] (const auto& foo) { return foo.bar == test; }; using boost::make_filter_iterator; […]

只移动std :: function的版本

因为std::function是可复制的,所以标准要求用于构造std :: function的可调用对象也是可复制的: n337(20.8.11.2.1) template<class F> function(F f); 要求: F应该是CopyConstructible。 对于参数typesArgTypes和返回typesR f应为Callable(20.8.11.2)。 A的拷贝构造函数和析构函数不得抛出exception 这意味着不可能从不可复制的绑定对象或捕获只移动types(如unique_ptr)的lambda形成std :: function。 这似乎有可能实现这种只移动的可移动的可移动的包装。 是否有一个标准的库移动只相当于std ::函数? 或者,这个问题是否有一个共同的解决方法?

为什么shared_ptr删除者必须是CopyConstructible?

在C ++ 11中std::shared_ptr有四个构造函数,可以传递typesD deleter对象d 。 这些构造函数的签名如下: template<class Y, class D> shared_ptr(Y * p, D d); template<class Y, class D, class A> shared_ptr(Y * p, D d, A a); template <class D> shared_ptr(nullptr_t p, D d); template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 该标准要求在[util.smartptr.shared.const]typesD是CopyConstructible。 为什么这需要? 如果shared_ptr复制了d那么这些删除者中的哪一个可能被调用? shared_ptr只能保持一个删除器吗? 如果d可以被复制,那么对于shared_ptr 拥有一个删除器意味着什么? CopyConstructible需求的基本原理是什么? PS:这个要求可能会使shared_ptr写删除变得复杂。 unique_ptr似乎对删除器有更好的要求。

std :: function存储指针可以指向数据成员吗?

从cppreference ,我发现: 类模板std :: function是一个通用的多态函数包装器。 std :: function的实例可以存储,复制和调用任何Callable目标函数,lambdaexpression式,绑定expression式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针 。 我不明白为什么一个std::function应该能够存储这样一个指针,我从来没有听说过这个function。 是真的有可能,我错过了什么,或者这是文档中的错误? 在这种情况下, operator()应该如何operator() ? 从文档 : 用参数args调用存储的可调用函数目标。 无论如何,这里没有存储可调用函数的目标。 我错了吗? 说实话,我甚至不知道这个函数的正确语法,否则我会写一个例子来testing它。 如何使用以下模板来定义数据成员的指针? template< class R, class… Args > class function<R(Args…)>

将std :: unique_ptr <Derived>转换为std :: unique_ptr <Base>

比方说,我有工厂函数处理基类和派生类: #include <memory> using namespace std; struct B { virtual ~B() {} }; struct D : B {}; unique_ptr<B> MakeB() { auto b = unique_ptr<B>( new B() ); return b; // Ok! } unique_ptr<B> MakeD() { auto d = unique_ptr<D>( new D() ); return d; // Doh! } 在上面的最后一行,我需要move(d)为了使其工作,否则我得到“错误:从std::unique_ptr<D>无效转换为std::unique_ptr<D>&& 。 我的直觉说,在这种情况下,编译器应该知道它可以隐含地将一个右值赋给基指针,但是它不会。 这是不符合我的编译器(gcc 4.8.1和VS2012)? unique_ptr的预期devise? 标准中的缺陷?

debugging模板实例

在使用C ++模板进行元编程时,是否有一种方法可以像debugging器一样使用,以便逐步实现模板的实例化和编译? 现在看来,在创build一个复杂的模板networking时,除了查看编译器错误消息以查看如何实例化模板(如果有任何编译器错误)之外,确实没有很好的debugging方法,并尝试从错误信息后退工作,如果意想不到的事情正在产生。 我不确定是否存在我正在寻找的东西,因为它必须是在编译时完成的东西,但基本上它会是一个方法,就像是逐步执行代码并检查堆栈框架gdb在运行时,在那里编译器可以停止,环境检查模板或嵌套模板集实例化的序列。 例如,我们假设我创build了一些简单的代码,如下所示: template<typename T, typename R = void> struct int_return_type {}; template<typename R> struct int_return_type<int, R> { typedef R type; }; template<typename T, typename R = void> struct float_return_type {}; template<typename R> struct float_return_type<float, R> { typedef R type; }; template<typename T> typename int_return_type<T>::type test() { cout << "T type is int" […]