2011-12-12 2 views
5

구성원 변수를 포함하는 my_struct 유형이 있다고 가정하면 함수는 f입니다. f은 C++ 11 람다 함수 일 수 있습니다.컴파일 타임에 형식이 람다식이 아닌지 확인하는 방법은 무엇입니까?

람다 객체에 할당하는 것은 불법이므로, f이 람다 일 때는 할당되지 않은 방식으로 my_struct의 할당 연산자를 구현하고 싶습니다.

람다에 대한 유형을 검사 할 수있는 유형 특성 is_lambda을 빌드 할 수 있습니까? 코드에서

: 람다의 종류 그냥 보통의 비 노조 클래스 타입으로, 컴파일러 지원없이

#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

인 아마도 할당 할 수없는 non-lambda 함수를 지정하고 싶지 않으므로 std::is_assignable을 사용할 수 있습니다.

+0

이것은 Visual C++ 2015에서 작동하는 것으로 보입니다. 아마도 이전 버전에서도 마찬가지 일 것입니다. 간단하게 :'std :: is_assignable :: value'을 호출합니다. _EBO_를 사용할 때 람다가 파생되지 않도록이 메서드를 사용했습니다. –

+0

@MatthewHolder 그 종류의 내 대답의 지점을 그리워하고, 그게 당신이 lambdas 특별한 치료를하려고해서는 안됩니다. 람다에서 파생 된 것은 본질적으로 잘못되었습니다. 그것은 까다로울 수있는 몇 가지 측면을 가지고 있지만, 그 같은 측면은 비 λ 클래스에 적용될 수 있습니다. 그들이 양도 할 수 없다는 사실은 그들 중 하나가 아니므로, 귀하의 경우, 나는 그것이 점검되어야 할 부분이 아니라고 생각합니다. – hvd

+0

이해할 만하지만 람다를 감지해야하는 상황은 Empty Base Optimization에 대한 클래스 템플릿의 기본 클래스로 사용될 클래스 템플릿 유형 인수에 FunctionObject를 전달할 때 발생했습니다. 특정 상황이나 특정 컴파일러에서는 람다 형식을 상속받을 수 없으므로 이 상황이 개선됨에 따라 더 이상 문제가되지 않습니다. –

관련 문제