เทมเพลตตัวแปรสามารถส่งผ่านเป็นอาร์กิวเมนต์เท็มเพลตเทมเพลตได้หรือไม่


11

ตัวอย่างที่ไร้สาระดังต่อไปนี้ไม่ได้รวบรวม แต่มีวิธีอื่นในการส่งแม่แบบตัวแปรเป็นอาร์กิวเมนต์แม่แบบแม่แบบหรือไม่

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

ลองใช้ Compiler Explorer

คำตอบ:


3

คำตอบสั้น ๆ : ไม่

คำตอบยาว: ใช่คุณสามารถใช้ทางอ้อมผ่านเทมเพลตชั้นเรียน:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

ตัวอย่างสด


ดูเหมือนว่าจะต้องย้อนกลับไปใช้โครงสร้างสมาชิกแบบคงที่ นี่เป็นสิ่งที่เราคาดหวังได้ในอนาคตหรือไม่ มีความคิดว่าทำไมวันนี้ถึงไม่มีความเป็นไปได้?
idclev 463035818

1
@ ก่อนหน้านี้ที่รู้จักกัน _463035818 ฉันไม่คิดว่ามีใครเสนอมันเลย (ไม่เคยเห็นมันในกระดาษบางทีฉันอาจจะพลาด) และมีความซับซ้อนเช่นกัน ตอนนี้พารามิเตอร์เท็มเพลตที่ไม่ใช่ประเภทคือค่า pr แต่value<T>จะหมายถึงอะไร การอ้างอิงถึงตัวแปรทั่วโลก? นอกจากนี้คุณไม่สามารถ ODR ใช้พารามิเตอร์แม่แบบที่ไม่ใช่ประเภทได้ แต่คุณสามารถทำได้กับแม่แบบส่วนกลาง
Guillaume Racicot

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