C ++ 11: वैरेडिक टेम्प्लेट फ़ंक्शन की संख्या पैरामीटर?


87

मैं एक वैरिएड टेम्पलेट फ़ंक्शन के लिए तर्कों की संख्या की संख्या कैसे प्राप्त कर सकता हूं?

अर्थात:

template<typename... T>
void f(const T&... t)
{
    int n = number_of_args(t);

    ...
}

number_of_argsउपरोक्त में लागू करने का सबसे अच्छा तरीका क्या है ?



22
@ R.MartinhoFernandes "पोस्ट योर आंसर" फॉर्म पेज के निचले भाग में कुछ इंच की दूरी पर है। ;)
काे

@ kay-SEisevil मुझे समझ में नहीं आता है कि आपकी टिप्पणी में उसकी तुलना में कम
नीलमणि

जवाबों:


104

बस इसे लिखें:

const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`

ध्यान दें कि nएक स्थिर अभिव्यक्ति है (अर्थात संकलन-समय पर ज्ञात), जिसका अर्थ है कि आप इसका उपयोग कर सकते हैं जहाँ निरंतर अभिव्यक्ति की आवश्यकता होती है, जैसे:

std::array<int,   n>  a; //array of  n elements
std::array<int, 2*n>  b; //array of (2*n) elements

auto middle = std::get<n/2>(tupleInstance);

ध्यान दें कि यदि आप पैक प्रकार के एकत्रित आकार (के रूप में करने का विरोध किया गणना करने के लिए चाहते हैं नंबर पैक में प्रकार के), तो आप इस तरह कुछ करने के लिए है:

template<std::size_t ...>
struct add_all : std::integral_constant< std::size_t,0 > {};

template<std::size_t X, std::size_t ... Xs>
struct add_all<X,Xs...> : 
  std::integral_constant< std::size_t, X + add_all<Xs...>::value > {};

फिर ऐसा करें:

constexpr auto size = add_all< sizeof(T)... >::value;

C ++ 17 (और बाद में) में, गुना अभिव्यक्ति का उपयोग करके प्रकार के आकार की गणना करना बहुत सरल है :

constexpr auto size = (sizeof(T) + ...);

उम्मीद है की वो मदद करदे।


9
+1 दो बातें सीखीं; sizeof...और constexpr। :)
Qix - मोनासा ने

1
तो यह sizeof...वास्तव में तर्कों की संख्या लौटाता है न कि सभी तर्कों के संयुक्त भंडारण आकार (जैसे sizeofएक सरणी पर)?
पैन्ज़ी

@ अपंजी: हाँ। sizeof ...(T)रिटर्न संख्या प्रकार के में पैक T। यदि आप पैक्ड प्रकारों के कुल आकार की गणना करना चाहते हैं, तो आप कुछ इस तरह से करना चाहते हैं: ideone.com/udggBk मैंने इसे अपने उत्तर में भी जोड़ा है।
नवाज

@ अपंजी: मेरे जवाब में गणना अब थोड़ा सुधरी है।
नवाज

2
C ++ 17 के साथ, व्यक्तिगत आर्ग प्रकार के आकार की गणना करने के लिए अब हम गुना अभिव्यक्ति का उपयोग कर सकते हैं return (0 + ... + sizeof(t));
P0W
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.