상속 된 함수에 대한 오버로드 해결
임의의 수의 람다를 취하고 모든 호출 연산자의 중앙 호출 지점 역할을하는 구조체를 갖고 싶습니다.
호출 연산자가 생성시 제공된 람다와 일치하지 않는 인수 목록을 사용하여 호출되는 경우 기본 호출 연산자를 호출해야합니다.
다음 코드가 정확히 이것을 수행 할 것이라고 생각했습니다. 모든 람다에 대한 호출 연산자는를 Poc
통해 클래스 로 "리프트"됩니다 using
.
template <typename ...Lambdas>
struct Poc : Lambdas...
{
using Lambdas::operator() ...; // Lift the lambda operators into the class
template <typename ...Ts>
auto operator() (Ts...)
{
std::cout << "general call" << std::endl;
}
};
// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;
int main()
{
auto l_int = [](int) {std::cout << "int" << std::endl; };
Poc poc{l_int};
poc(1);//calls the default operator. why?
return 0;
}
구조체에 기본 호출 연산자가 없으면 모든 것이 예상대로 작동합니다 (유효한 인수 목록 사용). 위의 코드에서와 같이 구조체에 추가하면 어떤 인수로 호출하든 기본 연산자가 매번 호출됩니다.
내 이해에 따르면 lambda-call-operators와 structs (default) call-operator는 동일한 범위에 있습니다. 따라서 과부하 해결을 위해 모두 살펴 봐야합니다. lamdba-operator는 일반 기본 연산자보다 더 구체적이므로 선택해야합니다.
분명히 그렇지 않습니다. 왜 그런 겁니까?
Microsoft Visual C ++ , Clang 및 GCC (모두 최신 버전)에서 테스트했습니다 .
편집하다:
- MSVC 15.8.9
- GCC 9.0.0 ( Wandbox 사용 )
- Clang 8.0.0 ( Wandbox 를 통해 )
그것을 발견하면 간단합니다. 연산자는 const
정규화 되지 않은 반면 람다의 것은 (람다를로 정의하지 않는 한 mutable
)입니다. 따라서 상수가 아닌 인스턴스와 더 잘 일치합니다 Poc
.
누락 된 부분 만 추가하세요 const
.
auto operator() (Ts...) const
참조 URL : https://stackoverflow.com/questions/53173336/overload-resolution-for-inherited-functions
'Development Tip' 카테고리의 다른 글
Xcode에서 스토리 보드 파일에 대한 불필요한 편집을 피하는 방법은 무엇입니까? (0) | 2020.12.31 |
---|---|
언제 개인 클래스를 정적으로 만들고 싶습니까? (0) | 2020.12.31 |
블룸 필터의 반대? (0) | 2020.12.31 |
char *와 std :: uint8_t * 사이의 reinterpret_cast-안전합니까? (0) | 2020.12.31 |
Pandoc 및 외국 문자 (0) | 2020.12.31 |