可以从命令行参数中读取 std::array 的维度吗?
Can the dimension of std::array be read from command line arguments?
我有一个 C++ 代码,我决定使用 std::array
而不是 std::vector
,我希望从命令行读取数组的大小。
在实践中,这可以用下面的片段来总结
#include <iostream>
#include <array>
#include <sstream>
int main(int argc, char* argv[]){
std::size_t my_size;
{
std::istringstream is{argv[1]};
is >> my_size;
}
std::cout << my_size<<std::endl;
std::array<int,my_size> a;
return 0;
}
编译器给出如下错误,这是由于编译时必须知道my_size
。
error: the value of ‘my_size’ is not usable in a constant expression
14 | std::array<int,my_size> a;
有没有办法让 std::array
的大小从命令行给出?还是我绝对应该使用其他容器?作为堆上的动态数组,或 std::vector
?
尤其是类型和数组大小必须在编译时知道,因此答案是:否。
您可以实现一些从运行时值到 compile-time 常量的映射。沿着
的方向
size_t size;
std::cin >> size;
if (size == 10) {
std::array<int,10> x;
// use x
} else if (size == 20) [
std::array<int,20> y;
// use y
}
但是,这个用途非常有限,因为x
和y
是不同的类型。当大小仅在运行时已知时,使用 std::vector
.
更容易
您可以将相对较小的尺寸转换为常量。
在C++17中可以这样解决。
#include <iostream>
#include <array>
#include <sstream>
#include <utility>
constexpr std::size_t MAX_SIZE = 10;
template <class T, class F, T... I>
bool to_const(T value, F&& fn, std::integer_sequence<T, I...>) {
return (
(value == I && (fn(std::integral_constant<T, I>{}), true))
|| ... // or continue
);
}
template <class T, class F>
bool to_const(T value, F&& fn) {
return value <= MAX_SIZE &&
to_const(value, fn, std::make_integer_sequence<T, MAX_SIZE + 1>{});
}
int main(int argc, char* argv[]){
std::size_t my_size;
{
std::istringstream is{argv[1]};
is >> my_size;
}
std::cout << my_size<<std::endl;
bool found = to_const(my_size, [](auto N)
{
std::array<int, N> a;
});
return 0;
}
我有一个 C++ 代码,我决定使用 std::array
而不是 std::vector
,我希望从命令行读取数组的大小。
在实践中,这可以用下面的片段来总结
#include <iostream>
#include <array>
#include <sstream>
int main(int argc, char* argv[]){
std::size_t my_size;
{
std::istringstream is{argv[1]};
is >> my_size;
}
std::cout << my_size<<std::endl;
std::array<int,my_size> a;
return 0;
}
编译器给出如下错误,这是由于编译时必须知道my_size
。
error: the value of ‘my_size’ is not usable in a constant expression
14 | std::array<int,my_size> a;
有没有办法让 std::array
的大小从命令行给出?还是我绝对应该使用其他容器?作为堆上的动态数组,或 std::vector
?
尤其是类型和数组大小必须在编译时知道,因此答案是:否。
您可以实现一些从运行时值到 compile-time 常量的映射。沿着
的方向size_t size;
std::cin >> size;
if (size == 10) {
std::array<int,10> x;
// use x
} else if (size == 20) [
std::array<int,20> y;
// use y
}
但是,这个用途非常有限,因为x
和y
是不同的类型。当大小仅在运行时已知时,使用 std::vector
.
您可以将相对较小的尺寸转换为常量。 在C++17中可以这样解决。
#include <iostream>
#include <array>
#include <sstream>
#include <utility>
constexpr std::size_t MAX_SIZE = 10;
template <class T, class F, T... I>
bool to_const(T value, F&& fn, std::integer_sequence<T, I...>) {
return (
(value == I && (fn(std::integral_constant<T, I>{}), true))
|| ... // or continue
);
}
template <class T, class F>
bool to_const(T value, F&& fn) {
return value <= MAX_SIZE &&
to_const(value, fn, std::make_integer_sequence<T, MAX_SIZE + 1>{});
}
int main(int argc, char* argv[]){
std::size_t my_size;
{
std::istringstream is{argv[1]};
is >> my_size;
}
std::cout << my_size<<std::endl;
bool found = to_const(my_size, [](auto N)
{
std::array<int, N> a;
});
return 0;
}