小编Nik*_*iou的帖子

具有自定义步骤的循环的C++范围

在c ++ 11中,您可以遍历带有range for循环的容器:

for (auto i : vec) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

除了反向迭代不那么明显(C++ 11基于反向范围的for循环)的缺点之外,它还受到无法为迭代定义自定义步骤这一事实的限制.

有办法吗?我无法理解它,但想象一下适配器

template<typename T>
struct step
{
    T const &container;
    step( T const &cont, int aStep);
    // provide begin()  / end() member functions
    // maybe overload the ++ operator for the iterators ? 
};

for (auto i : step(vec, i)) {}
Run Code Online (Sandbox Code Playgroud)

编辑:

讨论是关于实现类似于Pythons生成器https://wiki.python.org/moin/Generators的语义,例如range()函数.请不要对这会如何增加代码复杂性做出毫无意义的评论,没有人回过头来编写Python中的循环,尽管在C++中并非如此(我应该再说一遍:情况并非如此)在c ++)我想探索写作方式

for (auto i : range(vec, step))
Run Code Online (Sandbox Code Playgroud)

因为新标准提供了使用这种语法的工具.range()函数将是一次性的努力,代码的用户不必担心imlpementation的细节

c++

4
推荐指数
1
解决办法
2112
查看次数

是否有标准的库函数,与addressof相反?

我有一个算法,从指针转换为类

std::vector<MyClass>  input;
std::vector<MyClass*> ptrs;
std::vector<MyClass>  output;
Run Code Online (Sandbox Code Playgroud)

所以要获得ptrs我的帮助

transform(input.begin(), input.end(), back_inserter(ptrs), addressof<MyClass>);
Run Code Online (Sandbox Code Playgroud)

标准库中是否存在相反的操作,deref_of以便我可以得到如下结果:

transform(ptrs.begin(), ptrs.end(), back_inserter(output), deref_of<MyClass*>);
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
2
解决办法
169
查看次数

ISO c ++ 15.3.10:为什么这种未定义的行为?

从相关的c ++标准部分:

引用构造函数的函数try-block的处理程序中的对象的任何非静态成员或基类,或该对象的析构函数导致未定义的行为.

例如.

T::~T() 
{
      try {
        this->nonstatic_member; // iff I read the quote correctly
      } catch( ... ) {
      }
}
Run Code Online (Sandbox Code Playgroud)

那为什么这个未定义的行为?

c++ language-lawyer c++11

4
推荐指数
2
解决办法
259
查看次数

失败时返回dynamic_cast的类型

失败时,dynamic_cast返回0作为NULL指针.从c ++ 11开始nullptr,为什么不推荐使用已弃用的宏呢?是否有计划合并nullptr或是否有dynamic_cast使用新语法设施的替代方案?如果nullptr使用,它会破坏旧代码吗?

编辑

正如评论中指出的那样(并在答案中得到证实)

返回0作为NULL指针

很多c ++书籍中都有不好的措辞(见评论).请参阅答案/评论,以解释dynamic_cast操作员失败时实际发生的情况

c++ c++11

3
推荐指数
1
解决办法
247
查看次数

模板元函数组合 - 非案例

让我们说我有一个元功能

   template<bool, class L, class R>
   struct IF
   {
       typedef R type; 
   };


   template <class L, class R>
   struct IF<true, L, R>
   {
     typedef L type; 
   };
Run Code Online (Sandbox Code Playgroud)

我想要的是定义一个Not绑定IF并返回"对立状态" 的元函数.到目前为止我所拥有的是:

template<bool Cond, typename L, typename R, template<bool, typename,typename> class MF>
struct Not
{
    typedef typename MF<!Cond, L, R>::type type;
};
Run Code Online (Sandbox Code Playgroud)

这适用于这种特殊情况.我的问题是:

  1. 有没有办法提供更通用的解决方案?(关于我们正在扩展的元函数的参数和功能)
  2. 在C++中有没有经过验证的设计/习语/模式来做这些事情
  3. 我怀疑这可以做到boost::mpl.谁能提供一个例子?

c++ templates metaprogramming

3
推荐指数
1
解决办法
197
查看次数

订阅字符串文字

订阅字母数字是一种常见/有效的技术吗?什么是隐含的转换?例如:

#include <iostream>
using namespace std;

int main() 
{
    int k(2);
    cout << "Hello"[k] << endl;
    cout << (k-1)["Hello"] << endl;
    // your code goes here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
144
查看次数

递归定义的嵌套类型(就不完整类型而言)

Break定义中的递归在哪里cycle

#include <iostream>
using namespace std;

template<typename T>
struct Recursive
{
    using cycle = struct X : Recursive<X> {}; // would work for Recursive<T> as well
};

int main() 
{
    Recursive<int> x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,上面的代码可以编译- 它是一段有效的代码吗?如果是,该类型的含义(简要描述)是什么cycle

c++ templates crtp incomplete-type c++11

3
推荐指数
1
解决办法
636
查看次数

有没有一种从右到左阅读的编程语言?

我很确定现代工业强度的编程语言,全部从左到右阅读

但是在整个编程语言生态系统中,是否有从右到左阅读语言的例子?

除了更好地与以这种方式编写的人类语言保持一致之外,这样的语言还有什么优势吗?


例子 :

int a = 5; // read left to right
tfel ot thgir daer // ;5 = a tni 
Run Code Online (Sandbox Code Playgroud)

programming-languages

3
推荐指数
2
解决办法
2489
查看次数

模板化构造函数中的模板参数数

对于(可能是非模板化的)类,我可以使用模板化构造函数:

struct A {
    template<class T> A(T const& arg) {}
}
Run Code Online (Sandbox Code Playgroud)

模板参数的数量是否可以推导出的参数数量受限?如果是这样,相关的标准报价是什么?

例如,如果构造函数是

template<class T1, class T2> A(T2 const& arg) {}
Run Code Online (Sandbox Code Playgroud)

此调用将导致编译错误

A<int>(double()); // creation of a temporary
Run Code Online (Sandbox Code Playgroud)

或者我如何调用构造函数?这也失败了:

A::A<int>(double()); // creation of a temporary
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer c++11 c++14

3
推荐指数
1
解决办法
238
查看次数

检查真值环境中的空指针

让我们说我有一个指针

MyType *ptr;
Run Code Online (Sandbox Code Playgroud)

当用旧标准在"真值 - 值上下文"中检查该指针的有效性时,我会写这样的东西

if (ptr)    { ... // 1
while (ptr) { ... // 2
Run Code Online (Sandbox Code Playgroud)

问题在于,在这样的"真值上下文"中,我们期望将指针隐式转换为布尔值,因此我们将进行比较

if (NULL != ptr)    { ...
while (NULL != ptr) { ...
Run Code Online (Sandbox Code Playgroud)

然而,0弃用了与整数的宏进行比较,C++ 11建议进行比较nullptr.

在真值期间的情况下,如上面的(1)或(2),我们没有明确说

if (nullptr != ptr) { ...
while (nullptr != ptr) { ... 
Run Code Online (Sandbox Code Playgroud)

什么是我们的指针比较?它转换为布尔值?我们必须明确地比较nullptr吗?

c++ pointers c++11

2
推荐指数
1
解决办法
601
查看次数