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

时间:2014-07-07 22:48:49

标签: 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);
vector<list<T>> my_function(const list<vector<T>>& var, int cnt);

我该如何定义功能模板?

3 个答案:

答案 0 :(得分:1)

这就是你想要的 现在,您知道可以使用哪种容器,甚至可以用它做一些有价值的事情......

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

Coliru:http://coliru.stacked-crooked.com/a/bb06e39c799e3b5e
进一步阅读:Template Template Parameters

答案 1 :(得分: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;
}

但是,您无法使用以下行调用该函数:

std::vector<std::vector<int>> v;
my_function(v, 0);

my_function<std::vector, std::vector, int>(v, 0);

因为std::vector是使用多个模板参数定义的。解决该问题的一个方法是使用:

template <typename T>
using MyVector = std::vector<T>;

然后,您可以致电:

MyVector<MyVector<int>> v;
my_function<MyVector, MyVector, int>(v, 0);

仍在试图找出原因

MyVector<MyVector<int>> v;
my_function(v, 0);

不起作用。

答案 2 :(得分: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);
};

如果不符合您的要求,请告诉我。我们将继续努力。