gpt4 book ai didi

c++ - 交叉乘法非类型可变参数模板

转载 作者:行者123 更新时间:2023-12-04 02:28:42 25 4
gpt4 key购买 nike

我的目标是让这个模板起作用:

template <size_t... Ns>
struct mult
{
using cross = ?; // variadic size_t
static_assert(sizeof...(cross) + 1 == sizeof...(Ns), "");
};

所以我可以这样使用它:

mult<2,3,5>::cross // 6,15 // because 2*3=6, 3*5=15
mult<3,5,7,11>::cross // 15,35,77 // because 3*5=15, 5*7=35, 7*11=77

因为我需要做这个:

// tuple of arrays
std::tuple<std::array<size_t, mult<Ns...>::cross>...> cross_arrays;

最佳答案

这是一个解决方案,它不仅使用 static_assert 来证明叉积的顺序,而且还明确地证明整个叉积。

#include <type_traits>
#include <utility>
#include <cstddef>

template<size_t ...Ns> struct indices;

template<typename, typename> struct add_indices;

template<size_t ...N1, size_t ...N2>
struct add_indices<indices<N1...>, indices<N2...>> {

typedef indices<N1..., N2...> equals;
};


template<size_t ...Ns> struct cross_impl;

template<size_t N1, size_t N2> struct cross_impl<N1, N2> {

typedef indices<N1 * N2> result;
};

template<size_t N1, size_t N2, size_t N3, size_t ...Ns>
struct cross_impl<N1, N2, N3, Ns...> {

typedef typename add_indices< indices<N1 * N2>,
typename cross_impl<N2, N3, Ns...>::result
>::equals result;
};

template<size_t ...Ns>
struct mult
{
using cross=typename cross_impl<Ns...>::result;
};

int main() {

static_assert(std::is_same<typename mult<2,3,5>::cross,
indices<6,15>>::value);

static_assert(std::is_same<typename mult<3,5,7,11>::cross,
indices<15,35,77>>::value);

return 0;
}

关于c++ - 交叉乘法非类型可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65612815/

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