2011-12-12 28 views
5

Bir işlev olan f üye değişkeni içeren bir tür my_struct varsayalım. f'un C++ 11 lambda fonksiyonu olması mümkündür.Bir derleme zamanında türün lambda ifadesi olup olmadığı nasıl belirlenir?

Lambda nesnelerine atamak yasadışı olduğu için, f bir lambda olduğunda, atanmamış my_struct'un görevlendirme işlecini uygulamak istiyorum.

Bir tür yazım denetimi için is_lambda türünde bir çerçeve oluşturmak mümkün mü? kodda

: Bir lambda tipi sadece normal olmayan birlik sınıf tipi olduğu gibi, derleyici desteksiz

#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()); 
    } 
}; 

cevap

7

imkansız.

(aynı zamanda kapatma nesne türü) lambda ifade tipi

§5.1.2 [expr.prim.lambda] p3

benzersiz, isimsiz kaynamayan sınıf tipi [...]

4

olduğu Muhtemelen, atanamaz, lambda olmayan işlevleri de atamak istemiyorsanız, std::is_assignable'u kullanabilirsiniz.

+0

Bu, Visual C++ 2015'te, belki de önceki sürümlerde de çalışıyor gibi görünüyor. Basitçe kullanarak: 'std :: is_assignable :: value'. _BBO_ kullanırken bir lambda türetilmediğinden emin olmak için bu yöntemi kullandım. –

+0

@MatthewHolder Cevabımın noktasını bu kadar özlüyor olsa da, lambda özel muamelesi yapmaya çalışmamalısınız. Bir lambdadan türetmenin doğasında yanlış bir şey yok. Bunu zorlaştıracak bazı yönleri vardır, ama aynı yönler lambda olmayan sınıflara uygulanabilir. Atanmaması gerekenler bunlardan biri değil, bu yüzden sizin durumunuza göre kontrol edilmesi gereken bir konu değil. – hvd

+0

Kolay anlaşılır, ancak bir lambda algılamamı gerektiren bir durum, bir FunctionObject öğesinin Boş Temel Optimizasyon için sınıf şablonunun temel sınıfı olarak kullanılacak bir sınıf şablonu türü argümanına geçirilmesidir. Bazı durumlarda veya belirli derleyicilerde lambda tipi miras edemeyeceğinizden. Bu durum geliştikçe ... artık bir sorun olmayacak. –

İlgili konular