gpt4 book ai didi

c++ - 有没有办法获得给定数量的输入,其中数字在 C++ 的编译时由模板给出?

转载 作者:可可西里 更新时间:2023-11-01 16:32:02 27 4
gpt4 key购买 nike

例如,假设我创建了如下类:

template <unsigned int INPUT_SIZE>
class A{
public:
int operator()(int input, ...){ // get INPUT_SIZE-many inputs
// return sum;
}
};

我希望获得与 INPUT_SIZE 一样多的输入,而不是更多或更少。我怎样才能做到这一点?

另外,我用的是c++11,如果c++14以上有更好的办法,我也想知道。

最佳答案

Live demo 1

template <class T, auto> using always_t = T;

template <class T, class Arity>
struct A_impl;

template <class T, std::size_t... Is>
struct A_impl<T, std::index_sequence<Is...>>
{
int operator ()(always_t<T, Is>...)
{
return 0;
}
};
template <std::size_t N>
struct A : A_impl<int, std::make_index_sequence<N>>
{ };


A<2>{}(1, 2); // fine
A<2>{}(1, 2, 3); // fail

这是一个允许您计算参数总和的版本:

Live demo 2

template <class T, auto> using always_t = T;

template <class T, class Arity>
struct A_impl;

template <class T, std::size_t... Is>
struct A_impl<T, std::index_sequence<Is...>>
{
constexpr int operator ()(std::tuple<always_t<T, Is>...>&& t) {
auto adder = [](auto... ts) {
return (0 + ... + ts);
};
return std::apply(adder, std::move(t));
}
};

template <std::size_t N>
struct A : A_impl<int, std::make_index_sequence<N>>{
};

constexpr int sum = A<3>{}({1, 4, 5});
static_assert(sum == 10);

诀窍是使用 parameter pack长度N这样我们就可以用它来展开为N将特定类型乘以参数列表 A_impl::operator() .

一个参数包可以扩展成N重复(通常)在 ... 之前的模式


考虑这样一个函数:

template<class... T>
void foo(T...);

T...简单的说就是可以用连续的类型代替到foo的参数列表中, 一种可能的扩展可能是 foo(int, int, double, char) , 还要注意主持 ... 的内容是来自 class... T 的标识符.


回到代码,我们需要生成一个参数包,我们通过std::make_index_sequence<N>做到了这一点, 生成序列 0..(N-1)std::size_t... Is 捕获, 然后我们使用这个包来扩展模式 always_t<T, Is>那只是 T=int 的别名,这最终会重复 T=int元素的次数Is包含。

注:省略号参数...与参数包不同。

关于c++ - 有没有办法获得给定数量的输入,其中数字在 C++ 的编译时由模板给出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53901207/

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