官术网_书友最值得收藏!

18. Minimum function with any number of arguments

It is possible to write function templates that can take a variable number of arguments using variadic function templates. For this, we need to implement compile-time recursion (which is actually just calls through a set of overloaded functions). The following snippet shows how the requested function could be implemented:

template <typename T>
T minimum(T const a, T const b) { return a < b ? a : b; }

template <typename T1, typename... T>
T1 minimum(T1 a, T... args)
{
return minimum(a, minimum(args...));
}

int main()
{
auto x = minimum(5, 4, 2, 3);
}

In order to be able to use a user-provided binary comparison function, we need to write another function template. The comparison function must be the first argument because it cannot follow the function parameter pack. On the other hand, this cannot be an overload of the previous minimum function, but a function with a different name. The reason is that the compiler would not be able to differentiate between the template parameter lists <typename T1, typename... T> and <class Compare, typename T1, typename... T>. The changes are minimal and should be easy to follow in this snippet:

template <class Compare, typename T>
T minimumc(Compare comp, T const a, T const b)
{ return comp(a, b) ? a : b; }

template <class Compare, typename T1, typename... T>
T1 minimumc(Compare comp, T1 a, T... args)
{
return minimumc(comp, a, minimumc(comp, args...));
}

int main()
{
auto y = minimumc(std::less<>(), 3, 2, 1, 0);
}
主站蜘蛛池模板: 施甸县| 尚义县| 河北省| 衡山县| 兴安县| 蓬安县| 德保县| 梓潼县| 林州市| 奉化市| 伊吾县| 随州市| 嘉善县| 荔浦县| 怀安县| 马关县| 平邑县| 陵川县| 宁陵县| 宣武区| 镇原县| 台州市| 永寿县| 卢湾区| 三原县| 游戏| 阿拉善盟| 商水县| 大石桥市| 潢川县| 浏阳市| 清新县| 独山县| 呼图壁县| 武汉市| 余江县| 彰武县| 黄石市| 沁阳市| 万盛区| 乐昌市|