gpt4 book ai didi

d - 是否可以避免对独立函数进行重复的通用检查?

转载 作者:行者123 更新时间:2023-12-02 20:19:04 25 4
gpt4 key购买 nike

我喜欢独立函数,因为我可以调用像 v1.dot(v2)dot(v1,v2) 这样的点积,但它们需要更多的精力来编写。

例如

float dot(Vec)(in Vec v1, in Vec v2)
if(isVector!(Vec) && ...){
....
}

我还有很多不同的功能,只能在特定的维度上工作,并且检查都非常重复。

如果我能写一些长的东西就好了

template(Vec)
if(isVector!Vec && ...){
//functions here
float dot(in Vec v1, in Vec v2){..}
float length(in Vec v1, in Vec v2){..}
float lengthSquared(in Vec v1, in Vec v2){..}
}

我想像每个函数都有自己的模板一样调用它们,例如dot(v1,v2)。这样的事情是可能的还是我应该坚持使用方法?

最佳答案

我不太确定我是否得到了你的要求。是否将某些内容创建为方法/成员函数取决于您,并且与函数是否模板化实际上没有太大关系。如果期望函数采用特定类型,则可以将其声明为采用该类型,无论它是自由函数还是成员函数。如果一个函数应该适用于多种类型,那么它需要模板化,在这种情况下,如果其中一个参数总是应该是特定类型,那么它可以是该类型的成员函数,但除此之外,它必须是一个自由函数才能通用。

当您有一个模板化类型,并且您想编写一个仅采用该类型的自由函数时,就会出现问题。您被迫模板化自由函数并测试它给定的类型是否是该类型的实例化,因此模板约束开始变得更丑陋和更复杂,而成员函数本来可以是干净的。而不是类似的东西

template Vector(T)
if(...)
{
...
float dot(Vector v1, Vector v2) {...}
...
}

你最终会得到

float dot(V)(V v1, V v2)
if(isInstanceOf!(Vector, V))
{...}

这是可行的,但它添加了不必要的样板,唯一的好处是能够执行 dot(v1, v2) 而不是 v1.dot(v2)。我认为绝大多数 D 程序员都会认为这是丑陋且不必要的,而且无论如何他们通常都想做 v1.dot(v2) 。使用 UFCS 使得几乎所有代码都是 a.foo(b),无论 foo 是自由函数还是成员函数。你是我第一个听说尝试将所有内容都变成 foo(a, b) 而不是 a.foo(b) 的人,而且它在一般情况下,因为许多函数是成员函数并且不能作为自由函数调用,而所有函数都可以像成员函数一样被调用 - 这就是为什么通用代码应该倾向于使用 UFCS。它只是简单地使代码可以处理更多类型,并允许类型提供自由函数的特化作为成员函数。

但是,如果出于某种原因,您拥有通常是您需要(或真正希望)成为自由函数的成员函数的模板化函数,并且您希望减少冗余模板约束,那么执行此操作的方法是创造你自己的特质。例如

template myCond(T)
{
enum myCond = conditionAboutT1 && conditionAboutT2 && conditionAboutT3;
}

那么您的函数主机就不必重复其约束的该部分。例如

float dot(V)(V v1, V v2)
if(myCond!V && dotSpecificCondAboutV)
{...}

float lengthSquared(V)(V v1, V v2)
if(myCond!V && lengthSquaredSpecificCondAboutV)
{...}

但是,尝试将一堆函数分组到模板中以便它们可以共享约束实际上只有在它们是成员函数时才有效。如果你有类似的东西

template Vec(V)
if(...)
{
float dot(V v1, V v2) {...}
float lengthSquared(V v1, V v2) {...}
}

那么无论使用函数的地方都必须使用模板名称,并且您会失去 IFTI(隐式函数模板实例化),这就是它使您不必显式实例化模板化的原因函数及其所使用的类型。所以,不要得到类似的东西

auto result = dot(v1, v2);

auto result = v1.dot(v2);

你最终会得到类似的东西

auto result = Vec!Vector(v1, v2);

对于非模板类型或

auto result = Vec!(Vector!float)(v1, v2);

对于模板化类型。

最终,您确实需要让这些函数成为成员函数,或者让它们全部带有自己的模板约束单独列出 - 但无论如何,声明您自己的特征来测试常见的东西将减少模板约束的长度,使它们更容易理解和维护。

关于d - 是否可以避免对独立函数进行重复的通用检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592353/

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