2016-02-12 32 views
5

Có cách nào để lấy mẫu từ chuyên môn mẫu không? Ví dụ. std::unordered_map từ biến loại std::unordered_map<char, char> để được chuyển dưới dạng thông số mẫu mẫu.Mẫu từ chuyên môn mẫu

Minimal dụ:

#include <unordered_map> 

template <template <class ...> class t_map> 
class A 
{ 
public: 
    typedef t_map <int, int> map_type; 
}; 

int main(int argc, char const **argv) 
{ 
    std::unordered_map<char, char> map; 

    // decltype yields std::unordered_map<char, char> (as expected). 
    typename A<decltype(map)>::map_type map_2; 
    return 0; 
} 
+0

Nó phụ thuộc vào những gì bạn muốn làm gì với bản mẫu. Nói chung, bạn có thể vượt qua các loại chứ không phải mẫu. Những gì bạn có thể làm là thay thế các tham số mẫu. Bạn có thể cung cấp thêm ngữ cảnh không? – MarkusParker

+0

Tôi có một vài lớp học (vì lợi ích của đa hình) lấy một tham số mẫu mẫu và thực hiện một chuyên môn từ nó. Các lớp cung cấp giao diện tối thiểu cho một vùng chứa kiểu bản đồ. Ta lấy một 'std :: map', một' std :: vector' khác và thực hiện băm hoàn hảo. Để kiểm tra một số chuyên ngành của các lớp, sẽ thuận tiện khi viết một hàm chỉ sử dụng vùng chứa mô hình (ví dụ: 'std :: map ') mẫu sẽ được chuyển đến lớp của tôi. – tsnorri

Trả lời

3

Dưới đây là một ví dụ về cách để tạo ra một loại mới, nơi các tham số mẫu (int) được trao đổi (bằng string):

#include <vector> 
#include <string> 

template <typename container, typename newt> 
struct replace; 

template <typename p1, typename alloc, template<typename,typename > class containerTemplate, typename newt> 
struct replace<containerTemplate<p1,alloc>,newt> { 
public: 
    typedef containerTemplate<newt,alloc> result; 
}; 

int main() { 
replace<std::vector<int>,std::string>::result vs; 
vs.push_back("a string"); 
} 

Bằng cách này bạn có thể vượt qua std :: unordered_map như mẫu tham số cho hàm của bạn và thay thế char bằng bất kỳ loại nào khác mà bạn muốn. Bạn có thể cần phải điều chỉnh ví dụ của tôi theo nhu cầu của bạn. Nhưng nguyên tắc phải rõ ràng.

EDIT: More chung cho container, ít chung cho thay thế:

template <class Container> 
struct replace; 

template <template <class...> class Container, class... Ts> 
struct replace<Container<Ts...>> { 
    typedef Container<std::string> result; 
}; 
+0

Chà, bạn đã hoàn thành nó. –

+0

'alloc' có lẽ cũng nên được hồi phục thành loại mới. – Jarod42

0

Tôi không hoàn toàn chắc chắn, là những gì bạn đang tìm kiếm, nhưng sẽ không templatized bí danh phù hợp với tuyên bố vào ví dụ của bạn?

#include <iostream> 
#include <map> 

template <typename T> 
using mm = std::map<T, T>; 

int main() 
{ 
    mm<int> i; 
    mm<char> c; 
} 
+0

Thật không may là vì tôi muốn chuyển một biến chuyên biệt đến một hàm mẫu và truy cập vào mẫu ở đó. – tsnorri

Các vấn đề liên quan