如何在可变参数模板中使用索引
How To Utilize Index In Variadic Templates
我不确定这是否可能...我现在有一堂课,说我的班级:
template < typename ... Tn > MyClass;
需要时,我必须调用提供的函数"get"来访问MyClass对象的成员:
MyClass<int, float, A> obj1;
...
int & i = get<0>(obj1);
A & a = get<2>(obj1);
这是我的问题:如果我打算制作一个可变参数模板"外部"并以这种形式使用它:
class C
{
public:
C(int, float, A);
};
--
Outer<C> obj2(obj1);
"外部":
template < typename Ty >
class Outer
{
private:
Ty inner;
//template < MyClass >
Outer(const MyClass<ty ...> & args_packer)
{
}
};
我如何在可变参数模板中编写 Outer 的构造函数,以便它基本上可以执行以下操作:
Outer(const MyClass<int, float, A> & args_packer)
: inner(get<0>(args_packer), get<1>(args_packer), get<2>(args_packer))
{
}
?我首先要澄清的是,Outer 不仅仅是为 MyClass 设计的。MyClass 仅用于调试 Outer。
以下内容应该可以解决您的问题:
MyClass
似乎充当了std::tuple
,所以我改用它。
#include <cstdint>
#include <tuple>
#if 1 // not present in C++11
template<std::size_t... Is> struct index_sequence{};
template<int N, std::size_t... Is>
struct make_index_sequence : public make_index_sequence<N - 1, N - 1, Is...> {};
template<std::size_t... Is>
struct make_index_sequence<0, Is...> : index_sequence<Is...> {};
#endif
template <typename T>
class Outer
{
public:
template <typename ... Ts>
Outer(const std::tuple<Ts ...>& args_packer) :
Outer(args_packer, make_index_sequence<sizeof...(Ts)>())
{
}
private:
template <typename ... Ts, std::size_t ... Is>
Outer(const std::tuple<Ts ...>& args_packer, index_sequence<Is...>) :
inner(std::get<Is>(args_packer)...)
{
}
private:
T inner;
};
现在,让我们测试一下:
class A{};
class C
{
public:
C(int, float, A);
};
int main(int argc, char *argv[])
{
auto t = std::make_tuple(42, 0.5f, A{});
Outer<C> out(t);
return 0;
}
相关文章:
- 在索引和值类型上参数化的惯用向量类型
- 在运行时C++11 个索引模板参数包,以便访问第 N 种类型
- 如何获取参数包中元素的索引
- std::ios_base::register_callback 的索引参数有什么作用?
- 使用查找表选择具有运行时索引的可变参数类型
- 从 1 中创建新的字符 * 作为参数,元素位于 2 个索引之间
- 从常量字符*参数中取出索引
- 如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针
- 通过const函数中的参数索引返回std :: map的值
- 在gldrawelements中,索引参数的含义是什么
- 如何在可变参数模板中使用索引
- 有效地将参数包的大小提高到某个索引
- 根据给定的索引集获取参数包的子集
- 可变参数模板类,从其参数列表中获取特定类型的索引
- 将 char 数组作为参数传递时,为什么索引中不包含 null 终止符?
- 带有1个参数的C++2D数组索引(为什么这样做?)
- 通过带有数组索引的类传递参数
- 获取索引时qmodelindex的父参数
- 指针和数组上操作符[]的索引参数类型
- 使用Variadic模板解压缩参数列表时获取参数索引