Điểm quan trọng để biết liệu một đối tượng là một tích phân hay không hoặc là một loại lớp hay không?


14

Xin chào, tôi đã thấy nhiều ví dụ như thế này trong Cppreference.com:

std::is_class<T>
std::is_integral

Và như thế. Tôi biết nếu tôi chạy mã ví dụ tôi nhận được truehoặc false. Nhưng điểm trong đó là gì? vd: biết đối tượng có thuộc loại lớp hay không?

#include <iostream>
#include <type_traits>

struct A {};
class B {};
enum class C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<A>::value << '\n';
    std::cout << std::is_class<B>::value << '\n';
    std::cout << std::is_class<C>::value << '\n';
    std::cout << std::is_class<int>::value << '\n';
}

Đầu ra:

true
true
false
false
  • Tôi đã tìm kiếm khắp nơi trên cho một ví dụ thực tế sử dụng này ( is_class, is_integral, is_arithmetic, ...) Nhưng tất cả các hướng dẫn chỉ hiển thị các ví dụ tuyệt vọng: chỉ truehoặc false.

  • Bất cứ ai có thể giúp tôi với một ví dụ hữu ích nhỏ bằng cách sử dụng các mẫu này?


1
Một ví dụ đơn giản - std::copy. Điều gì xảy ra nếu các loại std::copy"đơn giản", như một mảng inthoặc char? Bạn sẽ sử dụng memcpy, phải không? Vậy làm thế nào để bạn nói "Nếu kiểu này đơn giản, hãy sử dụng memcpy, nếu không thì sử dụng vòng lặp" chậm "?
PaulMcKenzie

Câu trả lời:


17

Nó không phải để viết lên bàn điều khiển, chắc chắn là vậy.

Nhìn rộng hơn bạn đang hỏi: điểm của loại tính trạng là gì?

Câu trả lời là siêu lập trình mẫu . Ví dụ, tôi có thể tạo một chuyên môn mẫu làm một việc cho các kiểu tích phân và một điều khác cho các kiểu không tách rời.

Aaron Bullman có một giới thiệu đơn giản về các đặc điểm loại , cũng như Jacek ở đây .

Theo tôi, phần lớn việc sử dụng những thứ này sẽ được tìm thấy bị chôn vùi trong quá trình triển khai các tính năng và lớp và tiện ích thú vị (ví dụ như trong thư viện) như một phần của bộ máy nền làm cho tất cả hoạt động.

Đọc thêm:

câu trả lời đúng của câu hỏi đầu tiên đưa ra một ví dụ tuyệt vời về thời điểm các đặc điểm là hữu ích:

Ví dụ, việc triển khai std::copycó thể sử dụng std::memcpynội bộ thay vì vòng lặp rõ ràng khi các trình vòng lặp là con trỏ tới POD. Điều này có thể đạt được với SFINAE.


Vì vậy, ý bạn là ví dụ tôi có thể sử dụng chúng để vô hiệu hóa một số trường hợp mẫu cho loại cụ thể, ví dụ như logic để vô hiệu hóa hàm Power<T>hoặc lớp templated khi loại đối số không tách rời hãy nói std :: string?
Rami Yen

1
@RamiYen, Vâng, đó được gọi là SFINAE .
chris

7

Đó là cho lập trình meta mẫu. Khi bạn không biết loại nào, người dùng cuối sẽ chuyển vào mẫu. Đôi khi, nó báo cáo lỗi, đôi khi nó để chuyên về các loại được thông qua. Đôi khi nó là một sự kết hợp.

Các ví dụ được thấy trên cppreference.com (ví dụ: https://en.cppreference.com/w/cpp/types/is_enum ) được đơn giản hóa rất nhiều và chỉ cho thấy cách sử dụng đặc điểm theo cách không điển hình. Bạn gần như sẽ không bao giờ sử dụng những đặc điểm này trực tiếp trong một lớp đơn giản (hàm hoặc khuôn mẫu).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.