我有以下结构:
#define vec std::vector
struct A
{
std::mt19937 rng;
std::uniform_real_distribution<double> U;
A(){}
A(int sed)
{
rng.seed(sed);
U = std::uniform_real_distribution<double>(0, 100000);
}
template <typename T>
vec<T> get(int size)
{
vec<T> rst(size);
for (auto &x: rst) x = U(rng);
return rst;
}
template <typename T>
vec<vec<T>> get(int size1, int size2)
{
vec<vec<T>> rst(size1);
for (auto &x: rst) get(size2).swap(x);
return rst;
}
template <typename T>
vec<vec<vec<T>>> get(int size1, int size2, int size3)
{
vec<vec<vec<T>>> rst(size1);
for (auto &x: rst) get(size2, size3).swap(x);
return rst;
}
};
#undef vec
我知道这可能是一个遥远的事情,但是如何编写一个成员函数
magicGet()
,这样当我这样做时:
auto u = magicGet<T>(3, 1, 2, 5);
auto v = magicGet<T>(7, 9, 6, 2, 2);
auto w = magicGet<T>(6);
我会在
u
类型中获得vec<vec<vec<vec<T>>>>
,在v
类型中获得vec<vec<vec<vec<vec<T>>>>>
,在w
类型中获得vec<T>
等等?
如果不可能,最接近的解决方案是什么?
你可以尝试做类似的事情:
template <typename T, typename... Args>
auto magicGet(int size, Args... args)
{
vec<T> rst(size);
if (constexpr (sizeof...(args) > 0))
{
auto inner = magicGet<T>(args...);
for (auto &x : rst)
{
x = inner;
}
}
return rst;
}
请告诉我它是否有效。祝你好运!