विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ std::function विस्तार से

हाल ही में C++ कोड लिखते समय is_function का उपयोग किया, फिर चलते-चलते इसका सोर्स कोड इम्प्लीमेंटेशन देखा और कुछ बातें सामने आईं — पहले हमने तीन डॉट्स ... सीखे थे, तो छह डॉट्स ...... क्या हैं ये पता है?

उसी तरह, अगर ऐसा कोड हो:

template<typename... Args>
struct foo(Args......);

तो क्या पता है इसका मतलब?

आइए गहराई में उतरते हैं!

1.छह डॉट्स

छह डॉट्स को हम आमतौर पर two ellipsis operators कहते हैं, हम छह डॉट्स को तोड़ सकते हैं, जिससे निम्नलिखित तीन स्थितियाँ मिलती हैं

template <typename... Args> void foo1(Args......)
template <typename... Args> void foo2(Args... ...)
template <typename... Args> void foo3(Args..., ...)

अब देखने में आसान है, आइए std::is_function का कोड देखें।

2.is_function इम्प्लीमेंटेशन विवरण

std::is_function का इम्प्लीमेंटेशन primary टेम्पलेट और दो partial specialization से जुड़ा है:

// 主模板,假设提供的类型不是函数类型
template<typename T>
struct is_function : std::false_type {};

// 偏特化,用于正常的函数类型
template<typename Ret, typename... Args>
struct is_function<Ret(Args...)> : std::true_type {};

// 偏特化,用于变参函数类型
template<typename Ret, typename... Args>
struct is_function<Ret(Args......)> : std::true_type {};
  • primary टेम्पलेट मानता है कि दिया गया टाइप फ़ंक्शन टाइप नहीं है, और परिणाम के रूप में std::false_type देता है।
  • पहला partial specialization सामान्य फ़ंक्शन टाइप के लिए है, जिसमें Ret रिटर्न टाइप और Args... पैरामीटर टाइप्स दर्शाता है। अगर दिया गया टाइप इस फ़ंक्शन सिग्नेचर से मैच करता है, तो परिणाम std::true_type होता है।
  • दूसरा partial specialization variadic फ़ंक्शन टाइप के लिए है, जिसमें एलिप्सिस दर्शाता है कि फ़ंक्शन में पैरामीटर्स की संख्या बदल सकती है। इसी तरह, अगर दिया गया टाइप इस फ़ंक्शन सिग्नेचर से मैच करता है, तो परिणाम std::true_type होता है।

3.उपयोग का उदाहरण

आख़िर में std::is_function का एक उपयोग उदाहरण:

#include <iostream>
#include <type_traits>

int func(int x, int y) { return x + y; }
int vararg_func(int x, ...) { return x; }

int main() {
    std::cout << std::boolalpha;
    std::cout << "Is func a function? " << std::is_function<decltype(func)>::value << std::endl;
    std::cout << "Is vararg_func a function? " << std::is_function<decltype(vararg_func)>::value << std::endl;
    return 0;
}

यह आउटपुट देगा:

Is func a function? true
Is vararg_func a function? true

क्या सीख लिया, इस सेक्शन का अंत~

संबंधित विषय

टिप्पणियाँ