我需要定义一个函数,该函数有两个参数,第一个是包含一些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);
我该如何定义功能模板?
答案 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);
};
如果不符合您的要求,请告诉我。我们将继续努力。