मैं एक स्थिर रूप से बाध्य प्रतिनिधि वर्ग बनाने की कोशिश कर रहा हूं, जहां सदस्य कार्य संकलन समय पर बाध्य है, जिससे अनुकूलन सहायता मिलती है।सदस्य समारोह में सूचक के लिए टेम्पलेट तर्क कटौती?
मैं निम्नलिखित कोड है जो वास्तव में काम करता है मैं इसे कैसे करना चाहते हैं:
#include <iostream>
namespace thr {
template<typename T, T func>
struct delegate;
template<typename R,
typename C,
typename... A,
R (C::* mem_fun)(A...)>
struct delegate<R(C::*)(A...), mem_fun>
{
delegate(C* obj_)
: _obj(obj_)
{}
R operator()(A... a)
{
return (_obj->*mem_fun)(a...);
}
private:
C* _obj;
};
} // namespace thr
struct foo
{
double bar(int i, int j)
{
return (double)i/(double)j;
}
};
int main()
{
foo f;
typedef thr::delegate<decltype(&foo::bar), &foo::bar> cb;
cb c(&f);
std::cout << c(4, 3);
return 0;
}
हालांकि, उपयोग बहुत ही सुंदर नहीं है:
thr::delegate<decltype(&foo::bar), &foo::bar>
मैं एक समारोह टेम्पलेट का उपयोग करना चाहते हैं जो टेम्पलेट पैरामीटर को कम करता है और एक प्रतिनिधि उदाहरण देता है; के (इस कोड संकलन नहीं करता है) पंक्तियों के साथ कुछ:
template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}
यह और अधिक सुरुचिपूर्ण वाक्य रचना के लिए अनुमति होगी:
auto cb = bind(&foo::bar, &f);
यह एक समारोह टेम्पलेट में एक गैर प्रकार पैरामीटर अनुमान करना संभव है?
क्या मैं भी संभव हासिल करने की कोशिश कर रहा हूं?
कभी-कभी फ़ंक्शन टेम्पलेट में गैर-प्रकार पैरामीटर को कम करना संभव होता है, उदाहरण के लिए 'एन' को' टेम्पलेट size_t int_array_length (int (& array_ref) [N]) {वापसी एन;} 'में घटाया जा सकता है। लेकिन निश्चित रूप से 'एन' एक प्रकार का नहीं होने के बावजूद फ़ंक्शन हस्ताक्षर में एक प्रकार का हिस्सा है। –
एक मैक्रो जोड़ें: '# परिभाषित करें MAKE_DELEGATE (x, y) thr :: प्रतिनिधि (y) 'मैं फ़ंक्शन नामकरण से बचने के लिए कोई और तरीका नहीं देख सकता। –
@Iori: आपको एहसास है कि आपके उदाहरण में, 'टी' 'func' का प्रकार होगा, इसलिए 'decltype' आवश्यक नहीं है :)? –