小编acu*_*tea的帖子

如何在 C++20 中获得一个运行良好的生成器类模板?

我只是一个简单的编码员,经常使用 Python 并沉迷于它的生成器。据我了解目前的情况,它们可以使用协程在 C++20 中干净地实现,但是,至少在 C++23 之前,这不是一项微不足道的任务,因为需要编写生成器类(模板)。我如何得到一个

  1. 运行速度相当快(至少不比使用宏破解的生成器慢)
  2. 我可以使用 ranged-based for、ranges 库和一些等效的 Python next。如果有一种方法可以测试发电机是否已耗尽,那也很棒。
  3. 当(如果?)一个等价物被添加到标准库中时,我(很有可能)不需要太多地改变我的代码

这可能吗?

c++ generator c++20

5
推荐指数
1
解决办法
356
查看次数

为什么在 ctor 的参数列表中用 `decltype(x)` 替换成员 `x` 的类型会破坏类模板参数推导?

我正在尝试编写某种预处理器怪物来制作简单的 ctors。

这编译为g++ -std=c++17

template<typename T>
struct foo{
    T x;
    foo(T _x):x(_x){}
};
auto x=foo(3);
Run Code Online (Sandbox Code Playgroud)

但是怪物很难知道 的类型x,所以我尝试了这个:

template<typename T>
struct foo{
    T x;
    foo(decltype(x) _x):x(_x){}
};
auto x=foo(3);
Run Code Online (Sandbox Code Playgroud)

哪个失败(class template argument deduction failed)。但decltype(x)只是T无论如何,对不对?那么为什么代码示例不等效呢?

c++ templates template-argument-deduction c++17

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

为什么结构可以隐式转换以匹配函数的参数类型,但如果它是删除默认值的赋值运算符,则不能?

例子:

struct c{
    void operator=(bool){}
    operator bool(){
        return false;
    }
    c&operator=(const c&)=delete;
};

void f(bool){}

int main(){
    c a,b;
    f(b); //works fine
    a=b;  //g++ -std=c++17 says: error: use of deleted function ‘c& c::operator=(const c&)’
}
Run Code Online (Sandbox Code Playgroud)

为什么f(b)调用转换bboolmatchf的类型但a=b坚持不转换?

c++ implicit-conversion

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