我有一个需要std::array给定大小的函数N
void func(std::array<int,3> x) {
// do something
}
int main() {
func({4,4,4}) // works
func({4}) // works as well
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么第二个调用也有效,我的问题是:有没有办法在编译时检查我实际传递了多少参数?
背景:我不想允许第二次调用,我希望用户准确传递N参数。
我想使用std::views.
为了按顺序运行,代码如下所示:
int main() {
//pseudo-random numbers
random_device rd;
default_random_engine eng(rd());
uniform_int_distribution<int> distr(0, 100);
auto r = ranges::views::iota(0, 10);
vector<double> v(10, 1);
for_each(r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
for (auto&& i : v) cout << i << " "; cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
这很好用。我使用的是标准版本std::for_each(),而不是命名空间中的版本ranges,因为它们没有执行策略。现在是并行版本。唯一的区别:
for_each(execution::par, r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
Run Code Online (Sandbox Code Playgroud)
MSVC 报错:
error C2338: Parallel algorithms require forward iterators or stronger
Run Code Online (Sandbox Code Playgroud)
我在这里发现了类似的问题:Usingranges::view::iota inparallelalgorithm,我实现了那里提供的解决方案:
auto r = views::iota(0) …Run Code Online (Sandbox Code Playgroud) 我已经编写了一个模板类A<T>,并且正在利用零规则(我让编译器生成析构函数、复制/移动构造函数和赋值运算符重载)。但是,我现在需要一个自定义的赋值运算符,它采用不同的类型B<T>作为参数:
A<T>& operator=(const B<T>& rhs);
Run Code Online (Sandbox Code Playgroud)
此实现会阻止编译器生成默认析构函数等吗?我的猜测是否定的,因为编译器生成
A<T>& operator=(const A<T>& rhs);
Run Code Online (Sandbox Code Playgroud)
这与我想要实现的重载完全不同。
想象一下下面的定义。
struct X {
double a[8] {0.0};
double b[8] {0.0};
}
int main() {
X x;
x.a[10] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
当我访问时程序的行为是否未定义x.a[10]?
c++ ×4
algorithm ×1
c++20 ×1
operators ×1
overloading ×1
stack ×1
std-ranges ×1
stdarray ×1
visual-c++ ×1