从参数包中提取成员类型
Extracting member types from a parameter pack
我想定义一个函数,该函数接受任意数量的容器,该数字减去一个参数,除最后一个容器外,其他所有容器的value_types。
我可以轻松地提取最后一个容器的value_type并将其用作返回类型,但是,我对定义参数的类型一无所知。我会想象在 std::tuple_element_t 中折叠一个 std::integer_sequence 可能是一种方法,但我未能让它工作。
// example: 1D interpolator
template<typename... ContainerTypes>
typename std::tuple_element_t<
sizeof...(ContainerTypes) - 1,
std::tuple<ContainerTypes...>>::value_type
interpolate(const ContainerTypes& ... /*, ??? */)
{
// (...)
return {};
}
// intended use
std::array<int, 2> x{0, 2};
std::array<double, 2> y{0, 2};
int x_query{1};
double y_interpolated{interpolate(x, y)}; // compiles
//double y_interpolated{interpolate(x, y, x_query)}; // this is what I want
据我了解,您想转换重载:
template <typename C1, typename CLast>
typename CLast::value_type interpolate(const C1&,
const CLast&,
typename C1::value_type);
template <typename C1, typename C2, typename CLast>
typename CLast::value_type interpolate(const C1&, const C2&,
const CLast&
typename C1::value_type, typename C2::value_type);
// ...
变成可变参数模板。
拥有中间结构会更容易:
template <typename T, typename ... Ts>
struct InterpolatorImpl
{
const T& t;
std::tuple<const Ts&...> ts;
InterpolatorImpl(const T& t, const Ts&... ts) : t(t), ts(ts...) {}
typename T::value_type operator()(typename Ts::value_type...) const {/*...*/};
};
template <std::size_t...Is, typename Tuple>
auto InterpolatorHelper(std::index_sequence<Is...>, const Tuple& tuple) {
using LastType = tuple_element_t<sizeof...(Is), tuple>;
return InterpolatorImpl<LastType,
std::decay_t<std::tuple_element_t<Is, tuple>>...>
{
std::get<sizeof...(Is)>(tuple),
std::get<Is>(tuple)...
};
}
template <typename ...Ts>
auto Interpolator(const Ts&... ts) {
return InterpolatorHelper(std::make_index_sequence<sizeof...(Ts) - 1>(),
std::tie(ts...));
}
然后,称之为:
std::array<int, 2> x{0, 2};
std::array<double, 2> y{0, 2};
int x_query{1};
double y_interpolated{Interpolator(x, y)(x_query)};
或将您的签名更改为
template <typename ... InputContainers, typename TargetContainer>
typename TargetContainer::value_type
interpolate(const std::tuple<InputContainers...>&,
const TargetContainer&,
const std::tuple<typename InputContainers::value_type...>&);
相关文章:
- c++类声明时,相同的例程,不同的成员变量类型
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- 无法推断模板化类成员的类型
- 获取"rw_ssid"中成员"长度"的错误请求,该成员属于非类类型"char*"
- static_assert私有类成员的类型,没有实例
- 在运行时选择类成员的类型
- 错误:请求成员 .. 是非类类型"char"
- 如何在 c++ 中为多个类类型指定相同的模板化成员函数?
- 继承类中的 C++ 成员变量类型重写
- 错误:请求"数据"中的成员"大小",其非类类型为"int [5]"
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 避免对非类类型使用指向成员函数的指针
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 请求成员 'begin' in 'c' 中,它是非类类型 'char [101]' sort(c.begin(), c
- 如何删除类内类类型的类成员指针
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 如何进行编译时type_check并且仅在类成员的类型与类型匹配时才编译类的一部分?
- 如果类包含基类类型的成员作为第一个元素,后跟其他成员,编译器是否可以优化空基?