C++ 返回类型取决于函数参数的数量

问题描述 投票:0回答:1

我有以下结构:

#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>
等等?

如果不可能,最接近的解决方案是什么?

c++ templates variadic-functions type-traits variadic
1个回答
0
投票

你可以尝试做类似的事情:

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;
} 

请告诉我它是否有效。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.