从variadic模板参数声明成员变量
Declare member variables from variadic template parameter
显然,下面的代码不会在C 中编译。但是我有一个基于模板参数的零或多个数据项的类参数化类别的类别。
有什么办法可以声明一个类,该类别依赖于variadic模板参数的类,以便我可以访问每个类别?或其他一些方法来实现我想要的东西?
这是一个真实的程序出现的,我解决了一种完全不同的方式,但是现在我对我如何做的更抽象的问题感兴趣。
template <typename... Types> class Data
{
// Declare a variable of each type in the parameter pack
// This is NOT valid C++ and won't compile...
Types... items;
};
struct Item1
{
int a;
};
struct Item2
{
float x, y, z;
};
struct Item3
{
std::string name;
}
int main()
{
Data<Item1, Item2> data1;
Data<Item3> data2;
}
您可以使用std::tuple
#include <tuple>
template <typename... Types> class Data
{
std::tuple<Types...> items;
};
struct Item1
{
int a;
};
struct Item2
{
float x, y, z;
};
struct Item3
{
std::string name;
};
int main()
{
Data<Item1, Item2> data1;
Data<Item3> data2;
}
在这里尝试
这是std::tuple
的目的:
template <typename... Types> class Data
{
std::tuple<Types...> items;
};
标准已覆盖您。只需声明std::tuple<Types...> items
即可。
我希望能够使用具有折叠表达式的成员。所以我最终得到了:
template <class T, class... rest> class hold : hold<rest...> {
using base = hold<rest...>;
T v_;
public:
hold(T v, rest... a) : base(a...), v_(v) {}
template <class F, class... args> auto apply(F f, args... a) {
return base::apply(f, a..., v_);
}
};
template <class T> class hold<T> {
T v_;
public:
hold(T v) : v_(v) {}
template <class F, class... args> auto apply(F f, args... a) {
return f(a..., v_);
}
};
这是促进的:
template <class scalar, class... arrays> struct plus_expr {
hold<arrays...> a_;
plus_expr(arrays... a) : a_(a...) {}
scalar operator[](index const i) {
return a_.apply([i](arrays... a) { return (a[i] + ...); });
}
};
相关文章:
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 如何使用模板声明成员函数?(不是模板类)
- 如何使用 Boost.Hana 声明成员变量
- 声明成员对象而不调用其默认构造函数
- 使用函数类型语法声明成员函数
- 尝试访问标头声明成员时出现隔离错误
- 根据二手构造函数声明成员
- C 模板明确声明成员函数值/避免了宏的问题
- 如何在基本模板类中声明成员,其中类型取决于派生类的类型
- 错误:类中没有声明成员函数
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 从variadic模板参数声明成员变量
- 在类(C )中使用模板时未声明成员函数
- 错误:类中未声明 '' 成员函数
- 如何在指向常量地址时声明成员函数常量指针
- 何时以及为什么在堆C++上声明成员变量
- C++ 错误:未在范围内声明;成员函数
- 在不声明成员变量的情况下更改按钮颜色
- 错误 C2535:已定义或声明成员函数
- 当声明成员函数时,*New()是什么意思