2017-03-15 28 views
10

Có cách nào có thể đặt biệt hiệu cho lớp mẫu lồng nhau với từ khóa using không? Một cái gì đó như thế nàyLàm cách nào để đặt bí danh lớp mẫu lồng nhau với gói tham số variadic

template <typename... Types> 
struct Something { 
    template <typename... TypesTwo> 
    struct Another {}; 
}; 

template <typename... Types> 
template <typename... TypesTwo> 
using Something_t = typename Something<Types...>::template Another<TypesTwo...>; 

int main() { 
    Something_t<int><double>{}; 
    return 0; 
} 

này câu trả lời template template alias to a nested template? cho thấy một cách để làm điều đó nhưng điều đó sẽ không còn làm việc nếu cả hai gói tham số là variadic, như trình biên dịch sẽ không biết bắt đầu và nơi để kết thúc danh sách loại nơi.

+0

Tại sao bạn cần cách cụ thể như vậy? Bạn có thể thay đổi mã một chút và sử dụng mã tương tự 'Something_t :: Something2 ' – LmTinyToon

+0

@LmTinyToon Có thể làm mà không có nó nhưng tôi chỉ tự hỏi nếu nó là một điều. – Curious

+3

@LmTinyToon Bởi vì anh ấy tò mò ...: P – 101010

Trả lời

2

Không chính xác những gì bạn yêu cầu nhưng ... nếu bạn có thể quấn danh sách loại variadic của bạn như các đối số của các bộ (hoặc các lớp học tương tự) ...

#include <tuple> 

template <typename ... Types> 
struct Something 
{ 
    template <typename ... TypesTwo> 
    struct Another {}; 
}; 

template <typename, typename> 
struct variadicWrapper; 

template <typename ... Ts1, typename ... Ts2> 
struct variadicWrapper<std::tuple<Ts1...>, std::tuple<Ts2...>> 
{ using type = typename Something<Ts1...>::template Another<Ts2...>; }; 

template <typename T1, typename T2> 
using Something_t = typename variadicWrapper<T1, T2>::type; 

int main() 
{ 
    Something_t<std::tuple<int>, std::tuple<double>>{}; 
} 
0

Không phải là một câu trả lời độc lập, nhưng một sự bổ sung để max66 của câu trả lời:

Bạn có thể có thử này:

template<typename ... TT, typename ... TTT> 
using Alias = typename Something<TT...>::Another<TTT...>; 

Trông thật sự tốt đẹp lúc đầu, d phải không?

Vấn đề sau đó, tuy nhiên sẽ đã được với một tham số mẫu duy nhất:

Alias<int> a; 

Cái nào là nó bây giờ? Something<int>::Another<> hoặc Something<>::Another<int>? Và nếu bạn có nhiều thông số hơn, cách phân phối? Không có cơ hội để có được một giải pháp có ý nghĩa. Vì vậy, không, bạn không thể làm điều đó trực tiếp, bạn phải tự giúp mình với các thủ thuật như max66 được đề xuất ...

+1

Khá chắc chắn OP biết điều này sẽ không hoạt động. Như đã nêu trong câu hỏi ... – Barry

+0

Ông đã thử với cú pháp xấu (hai danh sách tham số mẫu) - chắc chắn * rằng * không thể làm việc. Trên đây là cú pháp chính xác (so sánh với anbom của max66), nhưng vẫn không thể hoạt động do ambiguites ... – Aconcagua

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