C++ 将同类包装类型的元组转换为原始类型的元组

标签 c++ c++17 wrapper variadic-templates stdtuple

我想调用std::apply()一个功能;但是,我不能,因为 std::tuple我用的是目前包装的。例如:

#include <tuple>

template <class T>
struct wrapped
{
    wrapped(T t) : t(t) {}

    T t;
};

template <class T, class ... Args>
struct delay_call
{
    T(*callback)(Args...);
    std::tuple<Args...> params;

    delay_call(T(*callback)(Args...), Args ... params) :
        callback(callback), params(params...)
    {}

    T call()
    {
        return std::apply(callback, params);
    }
};

template <class T, class ... Args>
struct delay_call_with_wrap
{
    T(*callback)(Args...);
    std::tuple<wrapped<Args>...> w_params;

    delay_call_with_wrap(T(*callback)(Args...), wrapped<Args> ... w_params) :
        callback(callback), w_params(w_params...)
    {}

    T call()
    {
        std::tuple<Args...> params; // = w_params.t
        return std::apply(callback, actual_params);
    }
};

float saxpy(float a, float x, float y)
{
    return a * x + y;
}

int main()
{
    float a = 1, x = 2, y = 3;
    delay_call delay_saxpy(saxpy, a, x, y);

    wrapped w_a = 1.f, w_x = 2.f, w_y = 3.f;
    delay_call_with_wrap w_delay_saxpy(saxpy, w_a, w_x, w_y);

    float result = delay_saxpy.call();

    float w_result = w_delay_saxpy.call();
}

delay_call 结构按预期工作;但是,我不确定如何提取每个元组元素的实际值并将其提供给 std::apply()执行。

简而言之,对于 delay_call_with_wrap::call ,我将如何转换 std::tuple<wrapped<Args>...>std::tuple<Args...>

最佳答案

我会完全避免 std::apply 并通过使用 std::index_sequence 解包元组直接调用 callback:

template <std::size_t ...I> T call_low(std::index_sequence<I...>)
{
    return callback(std::get<I>(w_params).t...);
}

T call()
{
    return call_low(std::make_index_sequence<sizeof...(Args)>{});
}

关于C++ 将同类包装类型的元组转换为原始类型的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323759/

相关文章:

c++ - 使用代理对象延迟更新与 "Avoid unnamed objects with custom construction and destruction"

c++ - C++ 中的运算符重载和多态性

c++ - C++ 循环中的指数运算符

c++ - QtCreator std::cout 和输出 Pane

c++ - 使用 long double 但不使用 double 的未定义行为

c++ - 必须在 std::vector<std::thread> 中加入 std::thread 两次以避免从线程 dtor 终止

c++ - 在一行中使用两个折叠表达式

c++ - 在 OpenGL 2.1 中,即使在 2d 空间(具有 2D 纹理)中使用 3D tex 坐标是否安全?

C - 将 va_list 传递给哨兵终止函数 - 需要 execlp() 的包装器

C++14 TS 功能和 GCC 4.8