显然,下面的代码不能用C++编译.但我有一个案例,我想基于模板参数参数化一个具有零个或多个数据项的类.
有没有什么办法可以声明一个数据成员依赖于可变参数模板参数的类,所以我可以访问它们中的每一个?或其他一些方式实现我想要的?
这是一个真正的程序,我已经解决了一个完全不同的方式,但现在我对如何做到这一点的更抽象的问题感兴趣.
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;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*nas 16
你可以用一个 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;
}
Run Code Online (Sandbox Code Playgroud)
在这里试试吧
Jar*_*d42 10
这是为了std::tuple
:
template <typename... Types> class Data
{
std::tuple<Types...> items;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够使用带有折叠表达式的成员。所以我结束了:
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_);
}
};
Run Code Online (Sandbox Code Playgroud)
这有利于:
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] + ...); });
}
};
Run Code Online (Sandbox Code Playgroud)