구성원 변수를 포함하는 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());
}
};
이것은 Visual C++ 2015에서 작동하는 것으로 보입니다. 아마도 이전 버전에서도 마찬가지 일 것입니다. 간단하게 :'std :: is_assignable :: value'을 호출합니다. _EBO_를 사용할 때 람다가 파생되지 않도록이 메서드를 사용했습니다. –
@MatthewHolder 그 종류의 내 대답의 지점을 그리워하고, 그게 당신이 lambdas 특별한 치료를하려고해서는 안됩니다. 람다에서 파생 된 것은 본질적으로 잘못되었습니다. 그것은 까다로울 수있는 몇 가지 측면을 가지고 있지만, 그 같은 측면은 비 λ 클래스에 적용될 수 있습니다. 그들이 양도 할 수 없다는 사실은 그들 중 하나가 아니므로, 귀하의 경우, 나는 그것이 점검되어야 할 부분이 아니라고 생각합니다. – hvd
이해할 만하지만 람다를 감지해야하는 상황은 Empty Base Optimization에 대한 클래스 템플릿의 기본 클래스로 사용될 클래스 템플릿 유형 인수에 FunctionObject를 전달할 때 발생했습니다. 특정 상황이나 특정 컴파일러에서는 람다 형식을 상속받을 수 없으므로 이 상황이 개선됨에 따라 더 이상 문제가되지 않습니다. –