gpt4 book ai didi

c++ - 让 C++ 以不丑陋的方式调用正确的模板方法

转载 作者:可可西里 更新时间:2023-11-01 18:39:48 29 4
gpt4 key购买 nike

我正在制作 vector 库,但遇到了障碍。我想允许递归 vector (即 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);

最后那个电话太丑了!如何仅使用 min(v1,v2) 调用正确的方法?我能想出的最好办法是摆脱“vec”类(因此必须将 v1 和 v2 定义为 container<2,float,vec_array<2,float>>)并再添加一个 template<N,T,VT>调用 min<N,T,VT,VT>(v1,v2) 的最小方法.

谢谢!

最佳答案

您将有一个重载决议,它更喜欢第一个 min对于第一种情况。它通过完全匹配接受两个参数,而第二个 min需要派生到基础的转换来接受参数。

正如您随后发现的(通过实验?),如果您使用 container<...>作为参数类型,而不是派生类,这将不再需要派生到基类的转换,并且重载决策将更喜欢第二个模板,因为否则两者都同样接受参数,但第二个模板(在您自己的解决方案中)是更专业。

然而在您自己的解决方案中,您需要放置一个 typename在返回类型之前使解决方案成为标准 C++。我认为导致您需要定义第二个模板的问题是为了使模板更专业,第一个 min min需要接受第二个模板接受的所有参数,这是通过尝试将第二个模板的参数与第一个模板进行匹配来计算的

container<N, T, VT1> -> T // func param 1
container<N, T, VT2> -> T // func param 2

因此,不同的模板参数类型试图推导出相同的模板参数,这将导致冲突并使第一个模板无法成功推导出第二个模板的所有参数。对于您自己的解决方案,情况并非如此:

container<N, T, VT> -> T // func param 1
container<N, T, VT> -> T // func param 2

这将使第一个模板从第二个模板推导出所有参数类型,而不是相反:container<N, T, VT>不会匹配任意 T .因此,您自己的解决方案的模板更专业并被调用,然后显式转发到其他模板。

最后请注意,您自己的解决方案只接受第三个模板参数相同的容器,而您的另一个 min模板接受两个函数参数的参数可以不同的容器。我不确定这是否是故意的 - 但考虑到另一个 min如果您不使第三个参数类型与上面显示的相同,则函数会发生冲突,我不确定如何解决该问题。


提问者随后编辑了他自己的答案,所以我上面提到的“你自己的答案”的大部分内容不再适用。

关于c++ - 让 C++ 以不丑陋的方式调用正确的模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com