gpt4 book ai didi

c++ - 将 std::array 作为模板可变参数函数的参数传递

转载 作者:可可西里 更新时间:2023-11-01 16:31:09 25 4
gpt4 key购买 nike

我正在尝试了解 C++11 中的可变参数模板。我有一个类,它基本上是 std::array 的包装器。我希望能够将函数对象(最好是 lambda)传递给成员函数,然后将 std::array 的元素作为函数对象的参数传递。

我使用了 static_assert 来检查参数的数量是否与数组的长度匹配,但我想不出一种方法来将元素作为参数传递。

这是代码

#include <iostream>
#include <array>
#include <memory>
#include <initializer_list>

using namespace std;

template<int N, typename T>
struct Container {
template<typename... Ts>
Container(Ts&&... vs) : data{{std::forward<Ts>(vs)...}} {
static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
}

template< typename... Ts>
void doOperation( std::function<void(Ts...)>&& func )
{
static_assert(sizeof...(Ts)==N,"Size of variadic template args does not match array length");

// how can one call func with the entries
// of data as the parameters (in a way generic with N)
}

std::array<T,N> data;
};

int main(void)
{
Container<3,int> cont(1,2,3);

double sum = 0.0;
auto func = [&sum](int x, int y, int z)->void{
sum += x;
sum += y;
sum += z;
};

cont.doOperation(std::function<void(int,int,int)>(func));

cout << sum << endl;

return 0;
}

所以我的问题(如代码中所示)是如何以一种与 通用的方式将 data 的条目传递给函数 func N?

奖励问题:是否可以在 main 中取消难看的到 std::function 的转换并直接传入 lambda?

最佳答案

鉴于众所周知的索引基础设施:

namespace detail
{
template<int... Is>
struct seq { };

template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> { };
}

你可以这样重新定义你的类模板:

template<int N, typename T>
struct Container {
template<typename... Ts>
Container(Ts&&... vs) : data{{std::forward<Ts>(vs)...}} {
static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
}

template<typename F>
void doOperation(F&& func)
{
doOperation(std::forward<F>(func), detail::gen_seq<N>());
}

template<typename F, int... Is>
void doOperation(F&& func, detail::seq<Is...>)
{
(std::forward<F>(func))(data[Is]...);
}

std::array<T,N> data;
};

这是一个live example .

注意,您不需要在 main() 中构造一个 std::function 对象:std::function 可以从 lambda 隐式构造。但是,您甚至根本不需要在这里使用 std::function,这可能会导致不必要的运行时开销。

在上面的解决方案中,我只是让可调用对象的类型成为编译器可以推导的模板参数。

关于c++ - 将 std::array 作为模板可变参数函数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834851/

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