【问题标题】:Force non-deduced context - type_identity etc强制非推断上下文 - type_identity 等
【发布时间】:2020-08-01 05:04:07
【问题描述】:

我正在尝试制作一个模板,该模板推断与一个模板参数关联的类型,同时在非推断上下文中处理其他类型。下面提供了一个最小的示例。我可以使用两个演绎上下文来做我正在寻找的事情,但它可以在一个中完成吗?我想我会尝试使用type_identity 之类的东西,但我没有运气。

现场示例:https://onlinegdb.com/By0iDOM-P

template<size_t... Idx, size_t s>
void foo(index_sequence<Idx..., s>) {
    cout << s << endl;
}

template<typename T>
struct TypeIdentity {
    using Type = T;
};

template<typename T>
using Identity = typename TypeIdentity<T>::Type;

template<typename... Idx, size_t s>
void bar(index_sequence<Identity<Idx>{}..., s>) {
    cout << s << endl;
}

template<size_t s>
void baz(index_sequence<0, s>) {
    cout << s << endl;
}

template<size_t... Idx>
struct Qux {
    template<size_t s>
    static void qux(index_sequence<Idx..., s>) {
        cout << s << endl;
    }
};

int main()
{
    foo<0>(make_index_sequence<2>{}); // couldn't deduce template parameter ‘s’
    bar<integral_constant<size_t, 0>>(make_index_sequence<2>{}); // couldn't deduce template parameter ‘s’
    baz(make_index_sequence<2>{});
    Qux<0>::template qux(make_index_sequence<2>{});

    return 0;
}

【问题讨论】:

    标签: c++ templates template-argument-deduction type-deduction


    【解决方案1】:

    没有。问题是Idx... pack 太贪心,无法为s 留下任何东西。您可以使用s, Idx... 获取第一个值,但不能使用Idx..., s 获取最后一个值。 TypeIdentity 不会帮助你做到这一点,你需要一些其他的技巧。

    例如解包成数组(C++14):

    template<std::size_t first, std::size_t... rest>
    void foo(std::index_sequence<first, rest...>) {
        const std::size_t indices[]{first, rest...};
        const std::size_t last = indices[sizeof...(rest)];
    
        std::cout << last << std::endl;
    }
    

    或使用fold expressioncomma operator (C++17):

    template<std::size_t first, std::size_t... rest>
    void foo(index_sequence<first, rest...>) {
        const std::size_t last = (first, ..., rest);
        std::cout << last << std::endl;
    }
    

    我隔离了first 以确保整个包first, rest... 永远不会为空。

    【讨论】:

    • 谢谢,两个推理上下文,是的!
    猜你喜欢
    • 2019-06-13
    • 2010-09-09
    • 2021-11-23
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多