อะไรคือจุดในการรู้ว่าวัตถุนั้นเป็นส่วนประกอบหรือไม่หรือเป็นประเภทของชั้นเรียนหรือไม่?


14

สวัสดีฉันเคยเห็นตัวอย่างมากมายใน Cppreference.com:

std::is_class<T>
std::is_integral

และอื่น ๆ ฉันรู้ว่าถ้าผมเรียกใช้รหัสเช่นฉันจะได้รับหรือtrue falseแต่ประเด็นคืออะไร เช่นรู้ว่าวัตถุเป็นประเภทของชั้นเรียนหรือไม่?

#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';
}

ผลลัพธ์:

true
true
false
false
  • ฉันได้ค้นหาทั่วสำหรับตัวอย่างจริงโดยใช้นี้ ( is_class, is_integral, is_arithmetic, ... ) แต่ทั้งหมดบทเรียนแสดงเฉพาะตัวอย่างที่สิ้นหวังเท่านั้นหรือtruefalse

  • มีใครช่วยฉันด้วยตัวอย่างเล็ก ๆ ที่มีประโยชน์โดยใช้แม่แบบนี้ได้ไหม


1
ตัวอย่างง่ายๆ - std::copy. เกิดอะไรขึ้นถ้าประเภทที่จะstd::copyเป็น "ง่าย" เช่นอาร์เรย์ของintหรือchar? คุณจะใช้memcpyใช่ไหม ดังนั้นคุณจะพูดว่า "ถ้าประเภทเป็นเรื่องง่ายใช้ memcpy มิฉะนั้นจะใช้วง" ช้า "?
PaulMcKenzie

คำตอบ:


17

มันไม่ได้มีไว้สำหรับเขียนถึงคอนโซลแน่นอน

คุณถามอย่างถี่ถ้วนมากขึ้น: อะไรคือลักษณะของประเภท?

คำตอบคือแม่แบบ metaprogramming ตัวอย่างเช่นฉันสามารถสร้างความเชี่ยวชาญเทมเพลตที่ทำสิ่งหนึ่งสำหรับประเภทอินทิกรัลและอีกประเภทสำหรับประเภทที่ไม่รวม

แอรอน Bullman มีการแนะนำง่ายๆที่จะพิมพ์ลักษณะเช่นเดียวกับ Jacek ที่นี่

ในความคิดของฉันพบว่าการใช้สิ่งเหล่านี้ส่วนใหญ่จะถูกฝังอยู่ภายในการใช้งานคุณสมบัติที่ยอดเยี่ยมและคลาสและยูทิลิตี้ (เช่นในห้องสมุด) เป็นส่วนหนึ่งของเครื่องจักรพื้นหลังที่ทำให้มันทำงานได้ทั้งหมด

อ่านเพิ่มเติม:

คำตอบของ rightfold ในตัวอย่างแรกนั้นเป็นตัวอย่างที่ยอดเยี่ยมว่าลักษณะใดมีประโยชน์เมื่อ:

ตัวอย่างเช่นการนำไปใช้std::copyอาจใช้เป็นการstd::memcpyภายในแทนการวนซ้ำอย่างชัดเจนเมื่อตัววนซ้ำเป็นตัวชี้ไปยัง POD สิ่งนี้สามารถทำได้ด้วย SFINAE


ดังนั้นคุณหมายถึงตัวอย่างเช่นฉันสามารถใช้พวกเขาเพื่อปิดการใช้งานบางกรณีของแม่แบบสำหรับประเภทที่เฉพาะเจาะจงเช่นมันเป็นตรรกะที่จะปิดการใช้งาน templated- ฟังก์ชั่นPower<T>หรือชั้นเรียนเมื่อประเภทอาร์กิวเมนต์ไม่สมบูรณ์
Rami Yen

1
@RamiYen ใช่ที่เรียกว่าSFINAE
chris

7

มันมีไว้สำหรับการเขียนโปรแกรมเมตาแม่แบบ เมื่อคุณไม่รู้ว่าผู้ใช้ประเภทใดที่จะส่งผ่านไปยังเทมเพลต บางครั้งก็เพื่อรายงานข้อผิดพลาดบางครั้งก็มีความเชี่ยวชาญในประเภทที่ผ่าน บางครั้งมันเป็นการรวมกัน

ตัวอย่างที่เห็นใน cppreference.com (เช่นhttps://en.cppreference.com/w/cpp/types/is_enum ) นั้นเรียบง่ายกว่ามากและแสดงวิธีใช้ลักษณะในแบบที่ไม่ธรรมดา คุณแทบจะไม่เคยใช้คุณสมบัติเหล่านี้โดยตรงในฟังก์ชั่นที่เรียบง่าย (ไม่ใช่ฟังก์ชั่นเทมเพลตหรือคลาส)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.