接受随机数量的输入cpp

时间:2014-11-21 17:01:50

标签: c++

我想接受程序的一些输入,输入是整数值。 接受输入的条件是输入数量不固定 但最大输入数量是固定的。 例如,假设最大输入限制为15个输入。 所以我应该能够接受" n"输入" n"可以有1到15之间的任何值。 有没有办法在cpp中执行此操作?

1 个答案:

答案 0 :(得分:0)

C和C ++中有一种通用机制,用于编写接受任意数量参数的函数。 Variable number of arguments in C++?。但是,这不会对args的数量产生限制或将重载限制为固定类型,并且通常使用(IMO)有点笨拙。

可以使用可变参数模板执行某些操作,例如:

#include <iostream>
#include <vector>

using namespace std;


void vfoo(const std::vector<int> &ints)
{
    // Do something with the ints...
    for (auto i : ints) cout << i << " ";
    cout << endl;
}


template <typename...Ints>
void foo(Ints...args)
{
    constexpr size_t sz = sizeof...(args);
    static_assert(sz <= 15, "foo(ints...) only support up to 15 arguments");    // This is the only limit on the number of args.

    vector<int> v = {args...};

    vfoo(v);
}


int main() {
    foo(1);
    foo(1, 2, 99);
    foo(1, 4, 99, 2, 5, -33, 0, 4, 23, 3, 44, 999, -43, 44, 3);
    // foo(1, 4, 99, 2, 5, -33, 0, 4, 23, 3, 44, 999, -43, 44, 3, 0); // This will not compile

    // You can also call the non-template version with a parameter pack directly:

    vfoo({4, 3, 9});

// Downside is that errors will not be great; i.e. .this
//    foo(1.0, 3, 99);
//    /Users/jcrotinger/Work/CLionProjects/so_variadic_int_function/main.cpp:21:22: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
//    vector<int> v = {args...};
//    ^~~~
//            /Users/jcrotinger/Work/CLionProjects/so_variadic_int_function/main.cpp:38:5: note: in instantiation of function template specialization 'foo<double, int, int>' requested here
//    foo(1.0, 3, 99);
//    ^

    return 0;
}

静态断言是唯一将此限制为15个参数的东西。正如注释所示,类型检查很麻烦,因为错误消息不是来自函数调用,而是来自向量的初始化。

这需要支持C ++ 11的可变参数模板。