2015-06-24 19 views
10

ऐसा लगता है कि मैं फ़ंक्शन-पॉइंटर फ़ंक्शन द्वारा टेम्पलेट किए गए टेम्पलेट पैरामीटर के रूप में नो-कैप्चर लैम्ब्डा पास नहीं कर सकता। क्या मैं इसे गलत तरीके से कर रहा हूं, या यह असंभव है?फ़ंक्शन-पॉइंटर फ़ंक्शन द्वारा टेम्पलेट किए गए टेम्पलेट पैरामीटर के रूप में लैम्ब्डा को पास करना

#include <iostream> 

// Function templated by function pointer 
template< void(*F)(int) > 
void fun(int i) 
{ 
    F(i); 
} 

void f1(int i) 
{ 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    void(*f2)(int) = [](int i) { std::cout << i << std::endl; }; 

    fun<f1>(42); // THIS WORKS 
    f2(42);  // THIS WORKS 
    fun<f2>(42); // THIS DOES NOT WORK (COMPILE-TIME ERROR) !!! 

    return 0; 
} 
+0

'std :: function' का उपयोग करें। – 101010

+1

f2 एक चर-रनटाइम पैरामीटर है। टेम्पलेट्स को समय पैरामीटर (स्थिरांक और प्रकार) बनाने की आवश्यकता होती है। कॉन्स जोड़ने का प्रयास करें, लेकिन यह शायद काम नहीं करेगा। – Hcorg

उत्तर

11

यह ज्यादातर भाषा की परिभाषा में एक समस्या है, निम्नलिखित यह और भी स्पष्ट करता है:

using F2 = void(*)(int); 

// this works: 
constexpr F2 f2 = f1; 

// this does not: 
constexpr F2 f2 = [](int i) { std::cout << i << std::endl; }; 

Live example

इसका मूल रूप से मतलब है कि आपकी उम्मीद/उम्मीद काफी उचित है, लेकिन भाषा वर्तमान में इस तरह परिभाषित नहीं है - एक लैम्ब्डा एक फ़ंक्शन पॉइंटर नहीं प्रदान करता है जो constexpr के रूप में उपयुक्त है।

हालांकि, इस मुद्दे को ठीक करने का प्रस्ताव है: N4487

4

इसका कारण यह है f2constexpr नहीं है व्यवहार्य नहीं है (यानी, किसी क्रम चर रहा है)। इस तरह इसे टेम्पलेट पैरामीटर के रूप में उपयोग नहीं किया जा सकता है। आप अपने कोड में परिवर्तन और निम्नलिखित तरीके से यह अधिक सामान्य बना सकता है:

#include <iostream> 

template<typename F, typename ...Args> 
void fun(F f, Args... args) { 
    f(args...); 
} 

void f1(int i) { 
    std::cout << i << std::endl; 
} 

int main() { 
    auto f2 = [](int i) { std::cout << i << std::endl; }; 
    fun(f1, 42); 
    f2(42); 
    fun(f2, 42); 
    return 0; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे