类型化元组包装器的实现

Implementation of typed tuple wrapper

一个实现看起来像什么,它环绕着例如std::tuple 作为 type/value 的静态列表,加上一个类型(不包含在元组中)来引用某种 owner/visitor.

我要实例化like

constexpr auto data = data_of<a>(1, 2.0);

背景

想法是使用 data_of<T>(...) 种结构将 type/data 对列表传递到像这样的批量函数中。

template <typename... _Ts>
static constexpr void do_bulk_stuff(_Ts&&... _Vs)
{
    // crazy stuff happens here
}
// call it like
do_bulk_stuff
(
    data_of<a>(1, 2.0), 
    data_of<b>(3), 
    data_of<c>(4.0, 5, 6),
    // ...
);

尝试 1

到目前为止,我最终得到了一个天真的(不工作)实施尝试,比如

template <typename T, typename... Ts>
struct data_of {
    using type = T;
    using data_t = std::tuple<Ts...>;
    data_t data;
    
    constexpr data_of(Ts&&... Vs)
    : data(Vs...)
    {}
};

目标

我的目标是实现这样的结果data_of<a>实例伪代码示例

{
    // meta
    type = a;
    data_t = std::tuple<int,double>;

    // runtime
    data = [1, 2.0];
}

您尝试的固有问题是 class 模板参数推导只是 而不是 与其对应的函数。如果显式指定了 class 模板的任何参数,则不会扣除。你失败了,因为尾随包总是(通过遗漏)指定为空。

解决方案是将负担转移到允许您仅指定部分参数的机制上:函数模板。

template <typename T, typename... Ts>
struct data_of_t {
    using type = T;
    using data_t = std::tuple<Ts...>;
    data_t data;
    
    constexpr data_of_t(Ts&&... vs)
    : data(std::forward<Ts>(vs)...)
    {}
};

template<typename T, typename... Ts>
constexpr auto data_of(Ts&&... vs) {
    return data_of_t<T, Ts...>(std::forward<Ts>(vs)...);
}

现在表达式的类型 data_of<a>(1, 2.0) 具有您所追求的相同“元”属性。