gpt4 book ai didi

c++ - 将 `templatezero()` 扩展/特化为可调用的 `T`

转载 作者:行者123 更新时间:2023-12-01 14:07:37 27 4
gpt4 key购买 nike

我正在尝试定义一个函数 template<typename T> zero()并将其专门用于各种情况。
zero<T>()应该回来

  • static T::zero()如果存在。
  • 否则 static_cast<T>(0)如果是这样定义的。

  • 到目前为止一切顺利,如下所示。

    现在我想以合理的方式将模板扩展到任何 T可以隐式转换为 std::function<Y(X...)> 形式的类型, 并且应该返回对应的归零函数 [](X...){return zero<Y>();}
    什么是最好的方法来做到这一点?
    namespace hidden {

    // tag dispatching
    template<int r>
    struct rank : rank<r - 1> {};

    template<>
    struct rank<0> {};

    template<typename T>
    auto zero(rank<2>) -> decltype(T::zero()) {
    return T::zero();
    }

    template<typename T>
    auto zero(rank<1>) -> decltype(static_cast<T>(0)) {
    return static_cast<T>(0);
    }

    // This is where I need help
    template<typename T>
    auto zero(rank<0>) -> std::enable_if_t</* T is implicitly convertible to std::function<Y(X...)> */,T> {
    using Y = // the type returned when an instance of T is invoked
    return []() {
    return zero<Y>();
    };
    }
    }

    template<typename T>
    auto zero() { return hidden::zero<T>(rank<10>{}); }

    编辑:

    我现在已经对每个预期签名使用具体签名重复以下内容:
    template<typename T>
    auto zero(rank<0>)
    -> std::enable_if_t<std::is_assignable<std::function<double(double)>, T>::value
    , std::function<double(double)>> {
    using Y = double;
    return []() {
    return zero<Y>();
    };
    }

    但我希望可以用模板魔术替换复制粘贴。

    最佳答案

    std::function 的扣除指南:

    template <typename T,
    typename F = decltype(std::function{std::declval<T>()}),
    typename Y = typename F::result_type>
    F zero(rank<0>) {
    return [](auto&&...) {
    return zero<Y>(rank<10>{});
    };
    }

    DEMO

    你需要写 this trait你自己。

    但是请注意,如果 T::operator(),这将不起作用。重载或表示函数模板(包括通用 lambda 表达式)。

    关于c++ - 将 `template<typename T>zero()` 扩展/特化为可调用的 `T`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62255679/

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