सारांश: मैं एक ऐसे फ़ंक्शन के साथ समाप्त करना चाहता हूं जो सटीक प्रकारों को घटा देता है जिसे इसे कहा जाता है और लेता है (उदाहरण के लिए) एक ट्यूपल जो उन्हें आगे बढ़ाता है (जिनके प्रकार समारोह के साथ बुलाए जाने वाले सटीक प्रकारों से अलग)।मूल प्रकारों के ज्ञान को कम करने, साथ ही
मैं किसी दिए गए फ़ंक्शन में तर्कों के प्रकारों को कटौती के माध्यम से "जानना" करने की कोशिश कर रहा हूं, साथ ही साथ उन्हें अग्रेषित करना। मुझे लगता है कि यह कैसे काम करता है इसके बारे में कुछ महत्वपूर्ण याद आ रही है। int,double,void*,std::string&,const char*
और अग्रेषित arugments भी -
#include <tuple>
#include <string>
#include <functional>
template <typename ...Args>
struct unresolved_linker_to_print_the_type {
unresolved_linker_to_print_the_type();
};
void f(int,double,void*,std::string&,const char*) {
}
template <typename F, typename ...Args>
void g1(F func, Args&&... args) {
unresolved_linker_to_print_the_type<Args...>();
auto tuple = std::forward_as_tuple(args...);
unresolved_linker_to_print_the_type<decltype(tuple)>();
}
template <typename F, typename T, typename ...Args>
void g2(F func, const T& tuple, Args... args) {
unresolved_linker_to_print_the_type<Args...>();
unresolved_linker_to_print_the_type<decltype(tuple)>();
}
int main() {
int i;
double d;
void *ptr;
std::string str;
std::string& sref = str;
const char *cstr = "HI";
g1(f, i,d,ptr,sref,cstr);
g2(f, std::forward_as_tuple(i,d,ptr,sref,cstr), i,d,ptr,sref,cstr);
}
मैं देखना चाहते हैं क्या एक परिदृश्य मेरी समारोह (जैसे g1
या g2
) कहा जाता हो जाता है जब यह जानता है, जहां और दोनों मूल प्रकार का उपयोग कर सकते है।
इस उदाहरण में मुझे यह जानकारी g1
या g2
के भीतर से नहीं मिल पाती है। (जानबूझकर, प्रकार बाहर मुद्रित करने के लिए) लिंकर त्रुटि मुझे पता चलता g1
में वे हैं:
int&, double&, void*&, std::string&, char const*&
int&, double&, void*&, std::string&, char const*&
और g2
में:
int, double, void*, std::string, char const*
int&, double&, void*&, std::string&, char const*&
दो बात कर रहे हैं मैं यहाँ नहीं मिलता:
क्यों मुद्रित (लिंकर त्रुटि के माध्यम से) प्रकारों में से कोई भी वास्तव में मेरे द्वारा पारित किए गए मिलान से मेल नहीं खाता है? (
int,double,void*,std::string&,const char
)। क्या मैं वास्तव में जो पारित किया गया था उसे कम कर सकता हूं? अधिमानतः "प्राकृतिक" वाक्यविन्यास के साथ, यानी सबकुछ सिर्फ एक बार और कुछ भी स्पष्ट रूप से लिखा नहीं गया है। मैं स्पष्ट रूप से लिख सकता हूं:g2<decltype(&f),decltype(std::forward_as_tuple(i,d,ptr,sref,cstr)),int,double,void*,std::string&,const char*>(f,std::forward_as_tuple(i,d,ptr,sref,cstr),i,d,ptr,sref,cstr);
लेकिन कम से कम कहने के लिए यह "अनावश्यक" है!
g1
में समारोह हस्ताक्षर घोषणा में&&
की उपस्थिति टेम्पलेट पैरामीटरArgs
अपने आप में प्रकार बदलने के लिए लगता है। की तुलना उस के साथ:template <typename T> void test(T t);
या:
template <typename T> void test(T& t);
के साथ उन लोगों में से किसी का उपयोग कर:
int i; test(i);
T
के प्रकार के परिवर्तन नहीं करता है।&&
T
के प्रकार को तब क्यों बदलता है जब&
नहीं होता है?
पुन: "टीएल; डॉ" - 2p2er? –
आप किस कंपाइलर का उपयोग कर रहे हैं जो विविध टेम्पलेट पैरामीटर का समर्थन करता है? –
@ जॉन डीबलिंग जी ++ 4.7.0, 20111010 ट्रंक संशोधन 17 9 76 9 इसे संकलित किया गया लेकिन लिंक नहीं किया गया (यानी मुझे उम्मीद थी कि मैं लिंकर त्रुटियों में प्रकार देख सकता हूं) – Flexo