Tag: c ++ 11

为什么没有std :: is_structtypes的特征?

我已经看到,为了检查typesT是否是我可以使用的类: bool isClass = std::is_class<T>::value; 它对于类和结构都返回true。 我知道在C ++中它们几乎是一样的,但是我想知道为什么在types特征中它们之间没有区别。 检查这种差异总是无用的,还是有更多的理由我不明白?

在C ++ 11中编写通用记忆function

寻找一种方法来实现一个通用的通用memoization函数,将采取一个函数,并返回相同的memoized版本? 在Python中寻找像@memo(来自Norving的网站)的装饰器。 def memo(f): table = {} def fmemo(*args): if args not in table: table[args] = f(*args) return table[args] fmemo.memo = table return fmemo 更一般的是,有没有办法用C ++来expressiongenerics和可重用的装饰器,可能使用C ++ 11的新特性?

C ++之间的差异03 throw()说明符C ++ 11 noexcept

除了分别检查运行时和编译时间之外, throw()和noexcept之间是否还有其他区别? 维基百科的C ++ 11文章指出,C ++ 03抛出说明符已被弃用。 为什么noexcept能够在编译时覆盖所有的内容呢? [注意:我把这个问题和这篇文章提到了 ,但是拿不到折服的可靠原因。]

C ++ 11中是否有一个范围类,用于基于范围的循环?

我发现自己写了一些: template <long int T_begin, long int T_end> class range_class { public: class iterator { friend class range_class; public: long int operator *() const { return i_; } const iterator &operator ++() { ++i_; return *this; } iterator operator ++(int) { iterator copy(*this); ++i_; return copy; } bool operator ==(const iterator &other) const { return […]

selectstd :: map和std :: unordered_map

现在, std在unordered_map有一个真正的哈希映射,为什么(或什么时候)我仍然想要在真正存在的系统map通过unordered_map使用好的旧map ? 有什么明显的情况我不能马上看到?

新的关键字=默认在C + + 11

我不明白为什么我会这样做: struct S { int a; S(int aa) : a(aa) {} S() = default; }; 为什么不直接说: S() {} // instead of S() = default; 为什么带来一个新的关键字?

在string,u16string和u32string之间转换

我一直在寻找一种在Unicodestringtypes之间进行转换的方法,并且遇到了这种方法 。 我不仅没有完全理解这个方法(没有评论),而且文章暗示将来会有更好的方法。 如果这是最好的方法,请指出是什么使其工作,如果不是,我希望听到更好的方法的build议。

为什么我应该避免函数签名中的std :: enable_if

Scott Meyers发表了他的下一本书EC ++ 11的内容和状态 。 他写道,书中的一个项目可能是“避免函数签名中的std :: enable_if”。 std::enable_if可以用作函数参数,作为返回types或作为类模板或函数模板参数来有条件地从重载parsing中移除函数或类。 在这个问题中,所有三个解决scheme都显示 作为函数参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct Check2 { […]

数组中传递给非主函数的基于范围的循环

当我尝试在gcc 4.8.2中编译下面的代码时,出现以下错误: test.cc: In function 'void foo(int*)': test.cc:15:16: error: no matching function for call to 'begin(int*&)' for (int i : bar) { ^ 还有一堆来自模板库的更深层次的内容。 #include <iostream> using namespace std; void foo(int*); int main() { int bar[3] = {1,2,3}; for (int i : bar) { cout << i << endl; } foo(bar); } void foo(int* bar) […]

带有包扩展的variablesfunction模板不在最后一个参数中

我想知道为什么下面的代码不能编译: struct S { template <typename… T> S(T…, int); }; S c{0, 0}; 这段代码无法使用clang和GCC 4.8进行编译。 这是clang的错误: test.cpp:7:3: error: no matching constructor for initialization of 'S' S c{0, 0}; ^~~~~~~ test.cpp:4:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided S(T…, int); ^ 在我看来,这应该起作用,而T应该被推断为是一包长度为1的包。 如果标准禁止这样做,有没有人知道为什么?