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

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);
}
主站蜘蛛池模板: 晋城| 新民市| 镇坪县| 静宁县| 怀宁县| 黔西县| 吉隆县| 隆化县| 新兴县| 永胜县| 隆昌县| 许昌县| 封丘县| 龙陵县| 班玛县| 峨眉山市| 当阳市| 额济纳旗| 运城市| 思茅市| 平利县| 临沂市| 彭山县| 晋中市| 仙居县| 志丹县| 柳林县| 麟游县| 巴马| 木兰县| 湖口县| 宁化县| 芷江| 上栗县| 金溪县| 宾阳县| 和政县| 福鼎市| 常州市| 湘乡市| 天台县|