首页 > 解决方案 > 实现 find_max

问题描述

下面的代码给出error: expansion pattern 'args' contains no parameter packs

template<typename T>
T find_max(T a) {
    return a;
}

template<typename T>
T find_max(T a, T args...) {
    T sofar = find_max(args...);
    if (a > sofar) return a;
    return sofar;
}

我找到了这个代码片段

T find_max(T a) {
    return a;
}

template<typename T, typename... Ts>
T find_max(T a, Ts... args) {
    T sofar = find_max(args...);
    if (a > sofar) return a;
    return sofar;
}

但是,这不会对类型施加任何约束,因为在find_max(2, 3, 3.2)编译时不会出错。如何在第一个片段中解压缩(如果没有,我们如何使用T args...) ?args

标签: c++templatesvariadic-templates

解决方案


这是

#include <iostream>

template<typename T>
T find_max(T a) {
    return a;
}

template<typename T>
T find_max(T a, T b) {
    T sofar = find_max(b);
    if (a > sofar) return a;
    return sofar;
}

template<typename T, typename... Ts>
T find_max(T a, T b, Ts... args) {
    T sofar = find_max(b, args...);
    if (a > sofar) return a;
    return sofar;
}

int main() {
  std::cout << find_max(2);
  std::cout << find_max(2, 3);
  std::cout << find_max(2, 3, 4);
  std::cout << find_max(2, 3, 4, 5);
  std::cout << find_max(2, 3, 4, 5.0);  // error: no matching function for call to 'find_max'
}

https://ideone.com/LwBdjG


推荐阅读