2016-03-16 34 views
5

tôi có mã một cái gì đó như thế này:suy luận kiểu của một tuple

template <typename T> 
inline typename ::std::enable_if< 
    is_std_tuple<T>{}, 
    T 
>::type 
get() 
{ 
    // pull tuple's elements from somewhere 
} 

Để suy ra các thông số mẫu loại các tuple được khởi tạo với, tôi đã đúc này:

static_cast<T*>(nullptr) 

và chuyển thông tin này làm tham số cho hàm

template <typename ...A> 
void deduce_tuple(::std::tuple<A...>* const); 

Tôi có cam kết UB không? Có cách nào tốt hơn?

+0

Không có gì sai khi truyền con trỏ rỗng đến loại, miễn là bạn không coi trọng nó. Tất cả những gì bạn đang cố gắng để làm gì? – Barry

+0

Tôi chỉ cần gói tham số 'A ...' trong hàm và không biết cách thực hiện nó bằng cách khác, ngoại trừ thủ thuật chỉ mục và ':: std :: tuple_element <>' – user1095108

+0

Một lợi ích của việc gắn bó với 'tuple_size' và' tuple_element' là mã của bạn làm việc với 'std :: pair' và' std :: array' quá miễn phí. –

Trả lời

5

Sự không hoàn hảo ở đây là chúng tôi không thể chuyên trách một phần các mẫu chức năng. Con đường của bạn là tốt, vì chúng tôi không dereferencing con trỏ null; Tôi muốn sử dụng thẻ được chỉ định:

template <typename...> struct deduction_tag {}; 

template <typename... Ts> 
std::tuple<Ts...> get(deduction_tag<std::tuple<Ts...>>) { 
    // […] 
} 
template <typename T> 
std::enable_if_t<is_std_tuple<T>{}, T> get() { 
    return get(deduction_tag<T>{}); 
} 
Các vấn đề liên quan