类型化元组包装器的实现
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)
具有您所追求的相同“元”属性。
一个实现看起来像什么,它环绕着例如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)
具有您所追求的相同“元”属性。