8

Tôi muốn biết cách viết một lớp type_traits để phát hiện xem có hai loại là chuyên môn của cùng một lớp mẫu hay không. Vấn đề lớn là nó nên làm việc cho các loại hỗn hợp/lớp mẫu không kiểu như:Phát hiện nếu hai loại là một chuyên môn của cùng một mẫu lớp?

template <typename T, std::size_t N> 
class MyClass {}; 

Có thể thiết kế một thứ như vậy không?

+0

@rhalbersma, không phải là một bản sao, câu hỏi khác muốn biết làm thế nào để cho biết nếu hai chuyên môn sử dụng cùng một định nghĩa, tức là cả hai đều sử dụng mẫu chính hoặc cả hai đều sử dụng cùng một chuyên môn từng phần hoặc cả hai đều sử dụng cùng một chuyên môn rõ ràng. Đó không phải là câu hỏi ở đây, theo như tôi có thể nói. –

+0

@Vincent, đặc điểm cần làm việc để phát hiện sử dụng mẫu _any_ class hay chỉ cho 'MyClass'? Tôi không nghĩ rằng nó có thể nói chung cho các mẫu lớp bằng cách sử dụng kết hợp các loại và các tham số không phải kiểu. –

+0

@JonathanWakely xóa nhận xét, dường như không thể rút bỏ phiếu bầu. – TemplateRex

Trả lời

1

Tôi không nghĩ bạn có thể làm điều này nói chung cho một mẫu lớp tùy ý với sự kết hợp của các thông số loại và không phải loại.

Bạn có thể nhận được gần cho bộ cụ thể hơn về các thông số, nhưng tôi không biết cách nào để xử lý các trường hợp chung:

#include <type_traits> 

template <typename T, std::size_t N> 
class MyClass {}; 

// assume not the same 
template<typename T, typename U> 
struct my_trait : std::false_type 
{ }; 

// both specializations of MyClass 
template<typename T1, std::size_t N1, typename T2, std::size_t N2> 
struct my_trait<MyClass<T1, N1>, MyClass<T2, N2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename, std::size_t> 
template<template<typename, std::size_t> class Templ, typename A1, std::size_t S1, typename A2, std::size_t S2> 
struct my_trait<Templ<A1, S1>, Templ<A2, S2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename...> 
template<template<typename...> class Templ, typename... A1, typename... A2> 
struct my_trait<Templ<A1...>, Templ<A2...>> 
: std::true_type 
{ }; 
+0

'decltype' trên' template lớp U> T get_scalar (U ); 'sẽ cho phép bạn tìm các loại vô hướng nếu bạn đã biết mô hình vô hướng/vô nghĩa. Tuy nhiên, chúng tôi không có một tham số mẫu 'template', bất kỳ tham số mẫu nào, hoặc' typename's '. – Yakk

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