2016-07-15 42 views
3

我想通过一个对的向量函数。实际的矢量实现以及对的类型应该是模板参数。向量的对通用向量和对类型,模板的模板

我认为是这样的:

template<uint8_t t_k, 
     typename t_bv, 
     typename t_rank, 
     template <template <template<typename t_x, 
            typename t_y> class std::pair> 
        typename t_vector>> typename t_vector> 

前3个其他模板参数。最后的模板参数应允许将std::pairvectorstdstxxl:vector)与uint32_tuint64_t一起作为pair.firstpair.second的类型。

+0

或者你可以让任何类型的,只要它有你需要(例如'vec.begin()','vec.end()','vec.begin()。第一/秒'的方法等) – MadScientist

+0

定义“实际向量实现”。 –

+0

是的矢量任何类型都会罚款我只想指定类型名称,并且它有一个类型参数std :: pair,它具有typename t_x和t_y的类型参数 –

回答

2

您可以使用此:

template<typename X, 
     typename Y, 
     template<typename, typename> class Pair, 
     template<typename...> class Vector> 
void fun(Vector<Pair<X, Y>> vec) 
{ 
    //... 
} 
+0

@JanB你使用什么编译器? – xinaiz

+0

非常感谢。它工作完美,比我想象的更容易。我使用gcc 4.9。 “ –

1

如果我理解正确的话,你想有一个函数,它的通用std::pairstd::vector。在这里你去:

template <typename First, typename Second> 
void function(std::vector< std::pair<First,Second> > vector_of_pairs) 
{ 
    ... 
} 

编辑:如果你想利用这两个std::vectorstxxl::vector,您可以使用模板模板参数与C++ 11的可变参数模板(因为std::vectorstxxl::vector有不同数量的模板参数):

template <typename First, 
      typename Second, 
      template <typename...> class AnyVector, 
      typename... OtherStuff> 
      void function(AnyVector<std::pair<First,Second>, OtherStuff...> vector_of_pairs) 
      { 
       /*...*/ 
      } 
+0

”应该允许传递一个向量(std或stxxl:vector)“ - 您的答案可以防止使用除”std :: vector“之外的任何内容。 –

+0

@JamesAdkison编辑 – PcAF

1

不确定要了解您的要求,但...下面的示例如何?

#include <iostream> 
#include <utility> 
#include <vector> 
#include <deque> 

template <typename P1, typename P2, template<typename...> class Vect> 
std::size_t func (const Vect<std::pair<P1, P2>> & v) 
{ return v.size(); } 

int main() 
{ 
    std::vector<std::pair<int, long>> v1{ {1, 1L}, {2, 2L}, {3, 3L} }; 
    std::deque<std::pair<long, int>> v2{ {3L, 1}, {2L, 2} }; 

    std::cout << func(v1) << std::endl; 
    std::cout << func(v2) << std::endl; 

    return 0; 
}