2014-05-13 18 views
6

Tôi có một vài lớp mẫu Impl (với một số phương pháp trừu tượng) được thực hiện một phần trong các tập tin CPP vì vậy mà tôi cần phải nhanh chóng một cách rõ ràng các mẫu của tôi cho các mối liên kết để tìm thấy nó, như thế này:Explicit mẫu instantiation với các mẫu variadic

template class Impl<T0>; 
template class Impl<T1>; 
template class Impl<T2>; 
... 
template class Impl<Tx>; 

Khi số loại Tx tăng lên, tôi muốn tìm một cách tốt hơn là mở rộng theo cách thủ công các danh sách các cảnh báo rõ ràng này trong tất cả các tệp cần thiết. Tôi nghĩ tôi có thể sử dụng các mẫu variadic cho điều này, vì vậy tôi thử như sau:

template <template <class> class, class...> 
struct type_map; 

template <template <class> class BaseT, class... Ts> 
struct type_map<BaseT, std::tuple<Ts...>> { 
    using type = std::tuple<BaseT<Ts>...>; 
}; 

typedef std::tuple<T0, T1, T2> MyTypes; 

Và trong file CPP:

template class type_map<Impl, MyTypes>; 

Tuy nhiên, điều này đã không nhanh chóng các mẫu như tôi dự định (các linker phàn nàn về các ký hiệu còn thiếu).

Có cách nào để làm cho phương pháp này hoạt động (tức là tạo mẫu mà không khởi tạo đối tượng của nó) hoặc cách tiếp cận hoàn toàn khác có thể giải quyết được sự cố của tôi trong trường hợp này không?

+0

bạn có cố gắng tạo dll không? có lẽ bạn phải thêm macro xuất khẩu vào loại 'type_map' của bạn –

+1

@Angew Tôi có một số lớp hoạt động như vậy, đó là lý do cho vấn đề của tôi. Tôi đã cố gắng xây dựng câu hỏi của mình một chút rõ ràng hơn. – fschoenm

+0

@vlad_tepesch Không, tôi không sử dụng DLL. Điều này chỉ liên quan đến vấn đề mà trình biên dịch không tạo ra các cá thể mẫu cần thiết trên các đơn vị biên dịch khác. – fschoenm

Trả lời

2

Tôi không nghĩ rằng bạn có thể làm điều này với các mẫu variadic, nhưng bạn có thể làm điều đó với bộ tiền xử lý.

Tôi thấy hai tùy chọn. Một sẽ được sử dụng Boost.Preprocessor:

// Definitions: 
#define ARGUMENTS (T0)(T1)(T2)(T3)(Tx) 

#define INSTANTIATE(maUnused, maTemplate, maType) \ 
    template class maTemplate<maType>; 


// Usage: 
BOOST_PP_SEQ_FOR_EACH(INSTANTIATE, Impl, ARGUMENTS) 

BOOST_PP_SEQ_FOR_EACH(INSTANTIATE, Impl2, ARGUMENTS) 

Một lựa chọn khác là sử dụng các X macro lừa:

x.hpp

X(T0) 
X(T1) 
X(T2) 
X(T3) 
X(Tx) 

#undef X 

using_file.cpp

#define X(maType) template class Impl<maType>; 
#include "x.hpp" 

#define X(maType) template class Impl2<maType>; 
#include "x.hpp" 
+0

Thật không may, tôi nghĩ rằng không có cách tiếp cận nào khác trong trường hợp này. Tôi chỉ có phương thức mẫu variadic để làm việc nếu các lớp của tôi không trừu tượng. Dù sao cũng cảm ơn bạn! – fschoenm

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