0%

用C++实现Python中的可变参数

Python中可以实现可变参数,而在C++中其实也可以,实现起来有点骚。

Python中的可变参数:

1
2
3
4
5
6
MOD = 998244353
def mmod(*args):
ret = 1
for i in args:
ret = ret * i % MOD
return ret

用C++实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const long long MOD = 998244353LL;

long long mod(long long x, long long p = MOD)
{
return ((x % p) + p) % p;
}

long long mmod()
{
return 1LL;
}

template <typename T, typename ...U>
long long mmod(const T &head, const U &... tail)
{
return mod((head % MOD) * mmod(tail...), MOD);
}

上面的return mod((head % MOD) * mmod(tail...), MOD);中的使用的mmod函数会根据tail的个数来指向正确的函数。

你还可以弥补某些STL的不足,比如说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
template<typename T>
class List : public vector<T>
{
public:
// new
template<typename ...U>
List(const U &... tail) : vector<T>(0)
{
pb(tail...);
}

// push_back
void pb() {}
template<typename ...U>
void pb(const T & head, const U &... tail)
{
this->push_back(head);
pb(tail...);
}

//print
void print()
{
const int LEN = this->size();
for (int i = 0; i < LEN; i++)
{
cout << (*this)[i] << (i == LEN - 1 ? '\n' : ' ');
}
}
};

这样你就可以愉快地一次性push_back很多东西了。
例如: List x = List(1, 3, 4); ,非常舒服。

回到开头