2011-12-12 44 views
5

假設我有一個包含成員變量f的函數my_structf可能是一個C++ 11 lambda函數。如何在編譯時檢測某個類型是否是lambda表達式?

由於分配給lambda對象是非法的,我想實現my_struct的賦值運算符,這樣當f是lambda時,它不被賦值。

是否有可能建立一個類型性狀is_lambda它可以檢查類型爲lambda-ness?

在代碼:

#include <type_traits> 

template<typename Function> struct is_lambda 
{ 
    // what goes here? 
}; 

template<typename Function> struct my_struct 
{ 
    Function f; 

    my_struct &do_assign(const my_struct &other, std::true_type) 
    { 
    // don't assign to f 
    return *this; 
    } 

    my_struct &do_assign(const my_struct &other, std::false_type) 
    { 
    // do assign to f 
    f = other.f; 
    return *this; 
    } 

    my_struct &operator=(const my_struct &other) 
    { 
    return do_assign(other, typename is_lambda<Function>::type()); 
    } 
}; 

回答

7

不可能沒有編譯器支持,作爲一個拉姆達的類型僅僅是一個正常的,非癒合類類型。

§5.1.2 [expr.prim.lambda] p3

的類型λ-表達(也是封閉的對象的類型)的是一個唯一的,不連無名類型[...]

4

大概你不想分配不可分配的非lambda函數,所以你可以使用std::is_assignable

+0

這似乎在Visual C++ 2015中工作,也許在早期版本中也是如此。簡單地使用:'std :: is_assignable :: value'。我使用這種方法確保lambda不是從使用_EBO_時派生而來的。 –

+0

@MatthewHolder雖然這種想法讓我想起了答案,但你不應該試圖給予lambdas特殊待遇。從lambda衍生出來沒有任何內在的錯誤。它有一些方面可能會使其變得棘手,但這些相同的方面可以適用於非lambda類。他們不可轉讓的事實不是其中之一,所以就你的情況而言,我認爲這不是應該檢查的方面。 – hvd

+0

可以理解,但是需要我檢測lambda的情況是將FunctionObject傳遞給將用作空基優化的類模板的基類的類模板類型參數。由於在某些情況下或某些編譯器中不能繼承lambda類型。隨着這種情況的改善......這將不再是一個問題。 –

相關問題