gpt4 book ai didi

c++ - 从参数中扣除数组长度

转载 作者:太空狗 更新时间:2023-10-29 21:34:30 27 4
gpt4 key购买 nike

给定一个参数签名为std::array<const size_t, V> shape的函数喜欢:

template<int V>
struct Cls {int val(){return V;} };


template <int V>
auto make(std::array<const size_t, V> shape) -> Cls<V>{
return Cls<V>();
}

我需要始终添加模板参数 V喜欢

auto t1 = make<2>({2, 3}); // does work but need the information twice
std::cout << t1.val() << std::endl;

因为大括号初始化器列表似乎被转换为 c++11 std::array .然而,这在我看来是多余的。 {2, 3}的长度是两个。我知道,编译器也应该知道。是否可以将其包装成:

// auto t0 = make({2, 3}); // doesn't work
// auto t0 = make(2, 3); // would be also ok

我尝试了确定 std::array 的大小之类的操作作为 constexpr .但我无法摆脱模板参数 <2> .

template <int V>
constexpr size_t arr_len(std::array<const size_t, V>){return V;}

template <typename V>
auto make2(V shape) -> Cls<arr_len(shape)>{
return Cls<arr_len(shape)>();
}

我在这里添加一个可运行的 MWE:

https://ideone.com/wrVe9M

thread似乎是相关的,但我看不出它有什么帮助。有什么建议吗?

最佳答案

我想您可以使用可变参数 make() 函数(下例中的 make0()),它可以将大小计算为 sizeof... (是)

下面是一个完整的工作示例

#include <array>
#include <iostream>


template<int V>
struct Cls {int val(){return V;} };


template <int V>
auto make(std::array<const size_t, V> shape) -> Cls<V>{
return Cls<V>();
}

template <typename ... Is>
auto make0 (Is ... is) -> Cls<sizeof...(Is)>
{ return make<sizeof...(Is)>({ {std::size_t(is)... } }); }

int main ()
{
auto t1 = make0(2, 3, 5, 7);

std::cout << t1.val() << std::endl;
}

关于c++ - 从参数中扣除数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230309/

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