c++ - 对数组元组中的项目调用可变参数模板函数

假设我有一个功能

template<typename retScalar, typename... scalars>
retScalar func_scalar(scalars... items);

在某处宣布。

我现在想要这个函数的“数组”版本

template<typename retScalar, typename... scalars>
std::array<retScalar, LEN> func_vec(std::tuple<std::array<scalars, LEN>...> vecs) {
     std::array<retScalar, LEN> res; // initialized somehow
     for (int i = 0; i < LEN; ++i) {
        res[i] = func_scalar(/* ?? */);
     }

     return res;
}

我搜索了很多,没有看到任何正确的方法来做到这一点。

回答1

感谢另一个 https://stackoverflow.com/questions/48539715/c-tuple-of-vectors-create-tuple-from-elements-by-index,我找到了这个解决方案,我觉得它很酷,可能对其他人有用

#include <cstdio>
 #include <tuple>

template<typename T>
struct myvect {
    T data[4];

};

template<typename... Ts>
struct helper {
    template<std::size_t... I> 
    static auto inner(int index, std::tuple<myvect<Ts>...> vects, std::index_sequence<I...>)
    {
        return std::make_tuple(std::get<I>(vects).data[index]...);
    }
};

template<typename... Ts>
auto elements(int index, std::tuple<myvect<Ts>...> vectors)
{
    return helper<Ts...>::template inner(index, vectors, std::index_sequence_for<Ts...>{});
}

template<typename retS, typename... args> 
struct vectorize {
    template<retS(*funcptr)(args...)>
    static myvect<retS> func_vect(std::tuple<myvect<args>...> v) {
        myvect<retS> res;
        for (int i = 0; i < 4; ++i) {
            res.data[i] = std::apply(funcptr, elements(i, v));
        }

        return res;
    }
};

int test(int a, int b) {
    return a + b;
}

int main() {
    myvect<int> a { 1, 2, 3, 4 };
    myvect<int> b { 2, 4, 6, 8 };
    auto added = vectorize<int, int, int>::func_vect<&test>(std::make_tuple(a, b));

    for (int i = 0; i < 4; ++i) {
        printf("%d\n", added.data[i]);
    }
}

相似文章

r - 由于某些标准,在个体中找到最佳组合

我想从许多人中随机组成一组。对于个人,我有关于他们的位置(两种可能性)和他们所属位置的团队的信息。目前尚不清楚有多少人将加入。应根据以下限制组成组:团体一般应由3-4人组成在一个组内,位置之间的份额(...

最新文章