मैं नीचे की तरह एक फ़ंक्शन टेम्पलेट को कॉल करना चाहता हूं:

#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;

struct size1 { size1() {std::cout << "Caling 1 \n";}};
struct size2 { size2() {std::cout << "Caling 2 \n";}};

template <typename T, typename std::conditional_t<sizeof(T) == 4, size1, size2> U>
void afficher(T a)
{
    std::cout << typeid(U).name();
}


int main(int argc, char *argv[])
{
    afficher(10); //Error can't deduct U
}

मुझे लगता है कि यहां मेरे पास एक गैर-कटौती योग्य संदर्भ है, मैं इसे कैसे ठीक कर सकता हूं और

क्या यहां उपयोगकर्ता std::conditional के लिए ठीक है या std::enable_if का उपयोग करें?

धन्यवाद।

1
Blood-HaZaRd 5 फरवरी 2019, 14:59

1 उत्तर

सबसे बढ़िया उत्तर

आपके पास सिंटैक्स समस्या है, और कुछ नहीं:

template <typename T, typename U = std::conditional_t<sizeof(T) == 4, size1, size2>>
void afficher(T a)         //  ^^^^
{
    std::cout << typeid(U).name();
}

जैसा कि टिप्पणियों में Jarod42 द्वारा नोट किया गया है, यह उपयोगकर्ताओं को आपके इरादे को बायपास करने और दूसरे तर्क के साथ कुछ भी करने की अनुमति देता है। आप इसके बजाय टाइपिफ़ का उपयोग कर सकते हैं:

template <typename T>
void afficher(T a)
{
    using U = std::conditional_t<sizeof(T) == 4, size1, size2>>;
    std::cout << typeid(U).name();
}
5
jrok 5 फरवरी 2019, 15:13