在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的细节
我有一个算法,从指针转换为类
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 ++标准部分:
引用构造函数的函数try-block的处理程序中的对象的任何非静态成员或基类,或该对象的析构函数导致未定义的行为.
例如.
T::~T()
{
try {
this->nonstatic_member; // iff I read the quote correctly
} catch( ... ) {
}
}
Run Code Online (Sandbox Code Playgroud)
那为什么这个未定义的行为?
失败时,dynamic_cast
返回0作为NULL
指针.从c ++ 11开始nullptr
,为什么不推荐使用已弃用的宏呢?是否有计划合并nullptr
或是否有dynamic_cast
使用新语法设施的替代方案?如果nullptr
使用,它会破坏旧代码吗?
编辑
正如评论中指出的那样(并在答案中得到证实)
返回0作为NULL指针
很多c ++书籍中都有不好的措辞(见评论).请参阅答案/评论,以解释dynamic_cast
操作员失败时实际发生的情况
让我们说我有一个元功能
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)
这适用于这种特殊情况.我的问题是:
boost::mpl
.谁能提供一个例子?订阅字母数字是一种常见/有效的技术吗?什么是隐含的转换?例如:
#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) 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
?
我很确定现代工业强度的编程语言,全部从左到右阅读
但是在整个编程语言生态系统中,是否有从右到左阅读语言的例子?
除了更好地与以这种方式编写的人类语言保持一致之外,这样的语言还有什么优势吗?
例子 :
int a = 5; // read left to right
tfel ot thgir daer // ;5 = a tni
Run Code Online (Sandbox Code Playgroud) 对于(可能是非模板化的)类,我可以使用模板化构造函数:
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) 让我们说我有一个指针
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
吗?