假设我们有以下嵌套循环:
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) 我定义了以下模板结构:
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++ 可能已经改变。
我有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] …
我有一个Foo定义内部 struct 的模板结构Bar。
现在,我想重载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#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}\nRun Code Online (Sandbox Code Playgroud)\n我看不到(也许是明显的)错误。
\n问题是否可以重载属于模板类的内部结构的运算符?
\nc++ ×4
algorithm ×1
c++20 ×1
decltype ×1
intersection ×1
iterator ×1
nested-loops ×1
set ×1
simd ×1
struct ×1