gpt4 book ai didi

c++ - 递归模板参数包编程

转载 作者:太空宇宙 更新时间:2023-11-04 15:31:43 25 4
gpt4 key购买 nike

我是 C++ 模板编程的新手。我想设计一个函数 element例如例如

  1. element<3, 3, 3, 3, 3>将返回 3
  2. element<3, 3, 2>将使断言失败

    #include <iostream>
    #include <cstdlib>

    namespace meta
    {
    template<typename T>
    constexpr T element(T x)
    {
    return x;
    }

    template<typename T, typename... Ts>
    constexpr T element(T x, Ts... xs)
    {
    constexpr T oth = element(xs...); // $C$
    static_assert(oth == x, "element Mismatch");
    return x;
    }

    template<int... DIMS>
    void get_elements()
    {
    std::cout << "elements " << element(DIMS...); // $A$
    }
    }

    int main(int argc, char ** argv)
    {
    meta::get_elements<2, 3, 4>(); // $B$

    static constexpr int D1 = 3, D2 = 3;

    meta::get_elements<D1, D2>();
    }

但是 GCC 与 std=c++14失败了

In instantiation of ‘constexpr T meta::element(T, Ts ...) [with T = int; Ts = {int, int}]’:

$A$: required from ‘void meta::get_elements() [with int ...DIMS = {2, 3, 4}]’

$B$: required from here

$C$: error: ‘xs#0’ is not a constant expression

$C$: error: ‘xs#1’ is not a constant expression

我想利用递归对列表中的每个模板参数执行相等性检查,如果它们都相等则返回其中一个。

最佳答案

参数不是constexpr

你可以使用 std::integral_constant 来绕过它

namespace meta
{
template<typename T, T V>
constexpr std::integral_constant<T, V> element(std::integral_constant<T, V>)
{
return {};
}

template<typename T, T V, typename... Ts>
constexpr std::integral_constant<T, V> element(std::integral_constant<T, V> x, Ts... xs)
{
constexpr auto oth = element(xs...); // $C$
static_assert(oth() == x(), "element Mismatch");
return {};
}

template<int... DIMS>
void get_elements()
{
std::cout << "elements " << element(std::integral_constant<int, DIMS>{}...); // $A$
}
}

关于c++ - 递归模板参数包编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50096825/

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