C++ 可以接受不同维度数组的函数

C++ 可以接受不同维度数组的函数,c++,multidimensional-array,vector,C++,Multidimensional Array,Vector,有没有一种方法可以创建一个函数,它可以在不重载的情况下获取向量的任意维 现在我有, someFunction(vector<int> a) someFunction(vector<vector<int> > a) someFunction(vector<vector<vector<int> > > a) someFunction(向量a) 函数(向量a) 函数(向量a) 但是,是否可能具有以下功能: singleFunc

有没有一种方法可以创建一个函数,它可以在不重载的情况下获取向量的任意维

现在我有,

someFunction(vector<int> a)
someFunction(vector<vector<int> > a)
someFunction(vector<vector<vector<int> > > a)
someFunction(向量a)
函数(向量a)
函数(向量a)
但是,是否可能具有以下功能:

singleFunction(<n-dimension vector>)
{
    // Get dimension of array/vector
}
singleFunction()
{
//获取数组/向量的维数
}

一个简单的模板应该可以解决这个问题。从内存:

template <T> singleFunction(vector<T> &t) {
    return t.size();
}
模板单函数(向量&t){
返回t.size();
}

您可以使用递归模板函数

#include <iostream>
#include <vector>

void func(int el) {
  std::cout << el << std::endl;
}

template<typename T>
void func(std::vector<T> v) {
  for (const T& el : v) {
    func(el);
  }
}

int main() {
  std::vector<std::vector<int>> v {{1, 2}, {2, 3}};
  func(v);
  return 0;
}
#包括
#包括
无效函数(整数){

std::cout也许您可以尝试这种方法,我认为这正是您所要求的(采用自):


演示:

您可以使用此代码获取维度

#include <vector>
#include <iostream>

template<unsigned N, typename T>
struct meta {
    static unsigned func() {//terminale recursion case
        return N;
    }
};

template<unsigned N, typename T>
struct meta<N, std::vector<T> > {//mid recursion case
    static unsigned func() {
        return meta<N + 1, T>::func();
    }
};

template<typename T>
unsigned func(T) { //adapter to deduce the type
    return meta<0, T>::func();
}

int main() {
  std::cout << func(std::vector<std::vector<std::vector<int> > >()) << std::endl;
  std::cout << func(std::vector<int>()) << std::endl;
  std::cout << func(int()) << std::endl;
  std::cout << func(std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<int> > > > > >()) << std::endl;
  return 0;
}

使用
C++17
可以编写一个非常简单的解决方案:

template<typename T >
constexpr int func(){
  if constexpr (is_vector<typename T::value_type>::value )
   return 1+func<typename T::value_type>();
  return 1;
}

int main() {
    cout<< func<vector<vector<vector<vector<vector<int>>>>>>() <<endl;
    return 0;
}

制作一个模板?只是模板上的代码>矢量<代码>。你在这个函数里面做什么?让我们后退一步:<代码>向量< /代码>:一个列表,一个有用的东西,没有更多的问题。<代码>向量< /代码>:一个列表列表;已经让你眉毛翘起了。你确定那是正确的数据结构吗?不愿意相信这是解决实际问题的正确方法。
向量
的“维度”等于
2
,还是与其中一个向量或包含向量的实际大小有关?这将返回
t
中的元素数,而不是“维度”也就是嵌套向量的数量。如果需要嵌套,那么我喜欢Killzone Kidware的Answare。这是一个智能的解决方案,可以迭代所有元素。但是你不会得到“维度”不管怎样,我完全同意@Baum-mit-Augen的评论:这是一个非常可疑的数据结构。虽然模板重载了非模板函数。所以不完全符合要求。我修复了它。更好?很好!但如果你解释说它有效,那将是一个更好的答案,因为第二个模板更专业“选择向量或向量的第一个,直到你得到一个只适用于第一个模板的简单向量为止。”SergeBallesta补充了一些解释,感谢你的建议C++17几乎是欺骗
5
3
#include <vector>
#include <iostream>

template<unsigned N, typename T>
struct meta {
    static unsigned func() {//terminale recursion case
        return N;
    }
};

template<unsigned N, typename T>
struct meta<N, std::vector<T> > {//mid recursion case
    static unsigned func() {
        return meta<N + 1, T>::func();
    }
};

template<typename T>
unsigned func(T) { //adapter to deduce the type
    return meta<0, T>::func();
}

int main() {
  std::cout << func(std::vector<std::vector<std::vector<int> > >()) << std::endl;
  std::cout << func(std::vector<int>()) << std::endl;
  std::cout << func(int()) << std::endl;
  std::cout << func(std::vector<std::vector<std::vector<std::vector<std::vector<std::vector<int> > > > > >()) << std::endl;
  return 0;
}
3
1
0
6
template<typename T >
constexpr int func(){
  if constexpr (is_vector<typename T::value_type>::value )
   return 1+func<typename T::value_type>();
  return 1;
}

int main() {
    cout<< func<vector<vector<vector<vector<vector<int>>>>>>() <<endl;
    return 0;
}
template<class T>
struct is_vector{
     static bool const value = false;   
};
template<class T>
struct is_vector<std::vector<T> > {
  static bool const value = true;
};