2015-06-24 70 views
10

看起來我無法將不捕獲lambda作爲模板參數傳遞給函數指針函數模板化。我是做錯了,還是不可能?將lambda作爲模板參數傳遞給由函數指針函數模板化

#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是一個變量 - 運行時參數。模板需要編譯時間參數(常量和類型)。嘗試添加const,但它可能不會工作。 – 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

這基本上意味着你的希望/期望是相當合理的,但是語言目前沒有這樣定義 - lambda不會產生適合作爲constexpr的函數指針。

但是,有一個解決此問題的建議:N4487

4

這是不可行的,因爲f2不是constexpr(即,是一個運行時變量)。因此它不能用作模板參數。你可以改變你的代碼,並使其通過以下方式進一步泛化:

#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; 
} 
相關問題