Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该如何定义这个复杂的函数模板?_C++_Templates_Stl_Containers_Template Specialization - Fatal编程技术网

C++ 我应该如何定义这个复杂的函数模板?

C++ 我应该如何定义这个复杂的函数模板?,c++,templates,stl,containers,template-specialization,C++,Templates,Stl,Containers,Template Specialization,我需要定义一个函数,函数有两个参数,第一个是容器,其中包含一些T类型的容器,第二个是整数,函数的签名可能如下所示: #include <vector> #include <string> #include <list> using namespace std; vector<vector<T>> my_function(const vector<vector<T>>& var, int cnt); v

我需要定义一个函数,函数有两个参数,第一个是容器,其中包含一些T类型的容器,第二个是整数,函数的签名可能如下所示:

#include <vector>
#include <string>
#include <list>

using namespace std;

vector<vector<T>> my_function(const vector<vector<T>>& var, int cnt);
vector<list<T>> my_function(const list<vector<T>>& var, int cnt);
#包括
#包括
#包括
使用名称空间std;
向量my_函数(const-vector&var,int-cnt);
向量my_函数(const list&var,int cnt);

我应该如何定义函数模板?

这就是您想要的。
现在,你知道什么样的容器可能会被使用,你甚至可以用它做一些有价值的事情

#include <vector>

template<class X> class Y{};

template<template<class outer, class... x>
  class inner, template<class element, class... x> class outer,
  class element, class... x>
inner<outer<element, x...>, x...>
my_function(const outer<inner<element>>& var, int cnt) {
  inner<outer<element, x...>, x...> ret;
  (void)var, (void)cnt;
  return ret;
}

int main() {
#if 1
    const std::vector<std::vector<int>> x;
#else
    const Y<Y<int>> x{};
#endif
    my_function(x, 0);
}
#包括
模板类Y{};
模板
内部的
my_函数(常量外部和变量,int-cnt){
内网;
(无效)var,(无效)cnt;
返回ret;
}
int main(){
#如果1
常数std::向量x;
#否则
常数Y{};
#恩迪夫
my_函数(x,0);
}
科里鲁:

进一步阅读:

您可以将函数定义为:

template<template<class> class outer,
         template<class> class inner,
         class element>
outer<inner<element>> my_function(
    const outer<inner<element>>& var, int cnt) {
  outer<inner<element>> ret;
  (void)var, (void)cnt;
  return ret;
}
然后,您可以拨打:

MyVector<MyVector<int>> v;
my_function<MyVector, MyVector, int>(v, 0);
myvectorv;
my_函数(v,0);
还在想原因吗

MyVector<MyVector<int>> v;
my_function(v, 0);
myvectorv;
my_函数(v,0);

不起作用。

我共享了一些代码,这些代码以更简洁易读的方式定义了函数

template <typename T>
class MyClass {
    typedef vector <T> ContainerVecT;
    typedef list <T> ContainerListT;

    typedef vector <ContainerVecT> MyContainerVecT;
    typedef vector <ContainerListT> MyContainerListT;

    MyContainerVecT my_function(const MyContainerVecT& var, int cnt);
    MyContainerListT my_function(const MyContainerListT& var, int cnt);
};
模板
类MyClass{
typedef向量ContainerVecT;
类型定义列表容器列表;
typedef载体MyContainerVecT;
typedef载体MyContainerListT;
MyContainerVecT my_函数(常量MyContainerVecT&var,int-cnt);
myContainerListMy_函数(常量MyContainerListT&var,int-cnt);
};

如果不能满足您的要求,请告诉我。我们会努力的。

@KerrekSB它不应该是空的而不是空的吗?好吧……如果你勇敢,你可以用谷歌模板-parameters@KerreSB我返回一个向量,但得到一个const vector&as参数怎么样?如果我理解,您有一个containertype_a行一个containertype_b列一个elementtype_c,您想返回一个containertype_b,其中列是containertype_a,行是elementtype_c?基本上,切换外部容器和内部容器类型+索引。。。你知道,使用facade和代理对象可能更容易、更快…@dguan:哦,我明白了,你想把X的容器B的容器a换成X的容器a的容器B吗?这似乎正是我想要的,但它在VS2013中没有编译,我得到了这个错误代码:1>d:\users\dguan\documents\visual studio 2013\projects\test\test\test.cpp(197):错误C2784:“内部my_函数(const-outer&,int)”:无法从“const-std::vector”推断出“const-outer&”的模板参数,谢谢,它确实给了我很好的提示,我正在努力……我期待着更新您需要的更改以满足vs13的要求。祝你摆弄它好运。谢谢,我会在g++上试试。而且,由于这似乎是最接近的解决方案,如果没有更好的答案,我将很快接受它。干杯
MyVector<MyVector<int>> v;
my_function<MyVector, MyVector, int>(v, 0);
MyVector<MyVector<int>> v;
my_function(v, 0);
template <typename T>
class MyClass {
    typedef vector <T> ContainerVecT;
    typedef list <T> ContainerListT;

    typedef vector <ContainerVecT> MyContainerVecT;
    typedef vector <ContainerListT> MyContainerListT;

    MyContainerVecT my_function(const MyContainerVecT& var, int cnt);
    MyContainerListT my_function(const MyContainerListT& var, int cnt);
};