gpt4 book ai didi

C++11 简化了调用同一模板函数的不同特化的模板函数的语法

转载 作者:行者123 更新时间:2023-12-02 09:54:49 25 4
gpt4 key购买 nike

有几个模板函数(具有相同的签名),例如:

template <typename T, typename P> void f1(T t, P p);
template <typename T, typename P> void f2(T t, P p);

还有一些具有相同逻辑的函数用不同的谓词调用它们:
template <typename T> void g1(T t)
{
f1(t, Pred1{});
...
f1(t, Pred2{});
...
}

// same as g1 but calls f2 instead of f1
template <typename T> void g2(T t)
{
f2(t, Pred3{});
...
f2(t, Pred4{});
...
}

我试图概括它们,我能想出的只是:
template <typename P1, typename P2, typename FP1, typename FP2, typename T>
void g(T t, FP1 fp1, FP2 fp2, P1 p1, P2 p2)
{
fp1(t, p1);
...
fp2(t, p2);
...
}

template <typename T> void g1(T t)
{
g(t, f1<T, P1>, f2<T, P2>, P1{}, P2{});
}

所以它过于冗长,尤其是对于真实类型,而不是本例中的玩具类型。
我必须分别通过 f()在泛化函数中调用的特化 g() ,我不得不两次提到每个谓词(首先,它在 f 特化中的类型,第二,谓词对象作​​为单独的参数)。

如果我删除 P1 p1, P2 p2来自 g() 的参数,我还是得这样称呼它: g<P1, P2>(t, f1<T, P1>, f1<T, P2>)
有没有办法让它更简单并避免重复?

我仅限于 C++11/14。

最佳答案

您不能有模板模板函数参数。

传递重载的方法是将它们包装在 Functor 中。

所以你的通用g变成:

template <typename F, typename T>
void g(F f, T t)
{
f(t, Pred1{});
...
f(t, Pred2{});
...
}

使用泛型 lambda 在 C++14 中创建仿函数更容易:
g([](auto e, auto pred){ return f1(e, pred); }, t);

在 C++11 中,仿函数更加冗长(尤其是捕获):
struct F1
{
template <typename T, typename Pred>
auto operator()(T t, Pred pred) const {
return f1(t, pred);
}
};

g(F1{}, t);

关于C++11 简化了调用同一模板函数的不同特化的模板函数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61104470/

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