首页 > 解决方案 > c++ 函数原型中的模板参数推导。在这种情况下可能的解决方法?

问题描述

底漆

我有一Vector门数学课。除其他外,它具有mean()计算向量内所有值的平均值的函数。它使用sum()我在此处添加的功能,只是为了完整性。

Vector

template <std::size_t N, typename T>
class Vector{
  public:
    
    // ...

    T sum() const {
      T ret{};
      for (const auto &item : data) {
        ret += item;
      }
      return ret;
    }

    template <typename U = T>
    U mean() const {
      return U(sum()) / N;
    }

  private:
    std::array<T,N> data;
};

函数本身有一个模板参数,因此该mean()函数的调用者可以选择指定他想要其结果的类型。例如,如果Vector是 type int,则如果将平均值强制转换为该类型,则可能会导致精度损失的Vector,在这种情况下int

Vector<3,int> vec{2,3,5};
int mean1 = vec.mean();
int mean2 = vec.mean<int>(); // same as mean1
float mean3 = vec.mean<float>();

正如预期的那样,这些值为

3
3
3.333333f

这一切都很好。这里没问题。

问题

我遇到的问题是当我想用一个自由函数(在课堂之外)实现同样的目标。我的第一个天真的实现是这样的

template <std::size_t N, class T>
T mean(const Vector<N, T> &other) {
  return other.mean();
}

但是当试图计算float平均值时,我必须总是调用这个自由函数,同时指定模板参数NT

Vector<3,int> vec{2,3,5};
float mean = mean<3, float>(vec);
//                ^^^i want to get rid of this "3"

问题

我知道模板参数推导在函数原型中不起作用......而且如果N不准确指定它,可能无法以某种方式推导参数。N但是也许有一个完全不相关的解决方法来消除在调用我看不到的自由函数时必须写出值的需要?

标签: c++functiontemplatesc++14template-argument-deduction

解决方案


我知道模板参数推导在函数原型中不起作用......并且可能没有办法以某种方式扣除参数 N 而不准确指定它。

什么?

但是也许有一个完全不相关的解决方法来消除在调用我看不到的自由函数时必须写出 N 值的需要?

如下呢?

template <typename U, std::size_t N, typename T>
U mean(const Vector<N, T> &other) {
  return other.template mean<U>();
}

你可以打电话

Vector<3,int> vec{2,3,5};

mean<float>(vec);

所以3int被推导出来,你只表达返回的类型 ( float)。


推荐阅读