让C++以一种不丑的方式调用正确的模板方法

Chr*_*ris 7 c++ templates

我正在烹饪一个矢量库并且遇到了障碍.我想允许递归向量(即vec<H,vec<W,T> >),所以我希望我的"min"和其他函数也是递归的.这就是我所拥有的:

template<typename T>
inline T min(const T& k1, const T& k2) {
 return k1 < k2 ? k1 : k2;
}
template<int N, typename T, typename VT1, typename VT2>
inline vec<N,T> min(const container<N,T,VT1>& v1, const container<N,T,VT2>& v2) {
 vec<N,T> new_vec;
 for (int i = 0; i < N; i++) new_vec[i] = min(v1[i], v2[i]);
 return new_vec;
}

...

template<int N, typename T>
class vec : public container<N,T,vec_array<N,T> > {

...

// This calls the first (wrong) method and says you can't call ? on a vec
vec<2,float> v1,v2;
min(v1,v2);
// This says the call is ambiguous
container<2,float,vec_array<2,float> > c1,c2;
min(c1,c2);
// This one actually works
vec<2,float> v3; container<N,T,some_other_type> v4;
min(v3,v4);
// This works too
min<2,float,vec_array<2,float>,vec_array<2,float> >(v1, v2);
Run Code Online (Sandbox Code Playgroud)

最后一个电话很难看!我怎样才能用正确的方法调用正确的方法min(v1,v2)?我能想到的最好的是摆脱"vec"类(因此v1和v2必须被定义为容器<2,float,vec_array <2,float >>)并添加一个template<N,T,VT>调用的min方法min<N,T,VT,VT>(v1,v2).

谢谢!

Chr*_*ris 0

template<typename T1, **typename T2**>
inline T1 min(const T1& k1, **const T2&** k2) {
    return k1 < k2 ? k1 : k2;
}

...

template<int N, typename T>
struct vec { 
    typedef container<N,T,vec_array<N,T> > t;
};


...

vec<2,float>::t v1,v2;
min(v1,v2);
Run Code Online (Sandbox Code Playgroud)

这就是我最终所做的让它发挥作用。

歧义是因为两个参数具有相同的类型 - container<2,float,vec_array<2,float> >。这是该方法的要点之一min(const T&,const T&)。由于min(const container<N,T,VT1>& v1, const container<N,T,VT2>& v2)是匹配并且更专业,因此它还获得了额外的分数,并且编译器无法决定使用哪一个。将通用 min 切换为使用两个类型参数 - min(const T1&, const T2&) - 使其提交。

我还转而使用“模板 typedef”而不是继承来定义 ,而vec<N,T>不必处理混乱的container<N,T,VT>东西。这使得它vec<N,T>::t与正确的函数完全匹配。

现在我使用的是 typedef 而不是继承,并且通用 min 函数中有两种类型而不是仅一种类型,因此将调用正确的方法。