小编edr*_*zen的帖子

使用迭代器将 C++ 嵌套循环转换为单个循环

假设我们有以下嵌套循环:

MyClass myobject;

for (const std::array<int,16>& arr : myobject)
{
    for (int i : arr)  {  /* do something with i */  }
}
Run Code Online (Sandbox Code Playgroud)

例如, whereMyClass可以迭代 16 个整数的数组。

现在,我想要一个循环来迭代所有数组的所有整数myobject

for (int i : MagicClass(myobject))  {  /* do something with i */  }
Run Code Online (Sandbox Code Playgroud)

MagicClass我想要设计的课程在哪里。我知道MagicClass应该实现begin/end返回特定迭代器的方法,即。就像是:

class MagicClass
{
public:
    MagicClass (MyClass obj) : obj_(obj) {}

    struct iterator 
    {
        // the hard part comes here...
    };

    iterator begin()  { return iterator (obj_.begin()); }
    iterator …
Run Code Online (Sandbox Code Playgroud)

c++ iterator nested-loops

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

在模板类型中使用 decltype 时模板专业化失败

我定义了以下模板结构:

template<typename T>  struct somestruct {}; 
Run Code Online (Sandbox Code Playgroud)

现在有以下专业:

template<typename T> struct somestruct <std::vector<T>>                {};  // OK
template<typename T> struct somestruct <decltype(std::vector<T>  {})>  {};  // KO
Run Code Online (Sandbox Code Playgroud)

但是,最后一个专业化不会编译并出现以下错误(请参阅此处):

error: template parameters not deducible in partial specialization:
Run Code Online (Sandbox Code Playgroud)

天真地,我会说这两个专业并没有那么不同,就像下面这样:

template<typename T> void test ()  
{ 
    static_assert (std::is_same_v<std::vector<T>, decltype(std::vector<T>{})> );
}
Run Code Online (Sandbox Code Playgroud)

问题:导致编译器第二个专业化失败的技术原因是什么?有没有办法解决它(我的意思是我的代码,而不是编译器)?

有一篇旧帖子似乎很相似,但也许 things/compiler/c++ 可能已经改变。

c++ decltype template-specialization c++20

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

计算N组交叉点的快速算法

我有n套A0,A2,...... An-1持有一套E的物品.

我将配置C定义为由n位组成的整数,因此C的值介于0和2 ^ n-1之间.现在,我定义以下内容:

(C)   an item e of E is in configuration C 
       <=> for each bit b of C, if b==1 then e is in Ab, else e is not in Ab
Run Code Online (Sandbox Code Playgroud)

例如,对于n = 3,配置C = 011对应于在A0和A1中但不在A2中的E项(NOT是重要的)

C[bitmap]是在集合中具有完全存在/不存在模式的元素的数量. C[001]是A0中不在任何其他集合中的元素数量.


另一个可能的定义是:

(V)   an item e of E is in configuration V 
       <=> for each bit b of V, if b==1 then e is in Ab
Run Code Online (Sandbox Code Playgroud)

例如,对于n = 3,(V)配置V = 011对应于A0和A1中的E项

V[bitmap]是所选集合的交集计数. (即位图为真的所有集合中有多少个元素的计数.) V[001]是A0中元素的数量. V[011] …

c++ algorithm intersection simd set

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

重载模板结构内结构的运算符

我有一个Foo定义内部 struct 的模板结构Bar

\n

现在,我想重载operator <<此内部 struct 的流Bar,但编译器似乎忽略了我的重载实现:

\n
\n

错误:与 \xe2\x80\x98operator<<\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98std::ostream\xe2\x80\x99 {aka \xe2\x80\x98std::basic_ostream< char>\xe2\x80\x99} 和 \xe2\x80\x98Foo<3>::Bar\xe2\x80\x99)

\n
\n

我的代码如下:

\n
#include <iostream>\n\n//////////////////////////////////////////////////////////////////////////////////////////\ntemplate<int N>\nstruct Foo\n{\n    struct Bar  {};\n};\n\n//////////////////////////////////////////////////////////////////////////////////////////\ntemplate<int N>\nstd::ostream& operator<< (std::ostream& os, const typename Foo<N>::Bar& x)\n{\n    return os;\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////\nint main (int argc, char** argv)\n{\n    Foo<3>::Bar x;\n\n    std::cout << x << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我看不到(也许是明显的)错误。

\n

问题是否可以重载属于模板类的内部结构的运算符?

\n

c++ struct operator-overloading

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