Development Tip

상속 된 함수에 대한 오버로드 해결

yourdevel 2020. 12. 31. 23:00
반응형

상속 된 함수에 대한 오버로드 해결


임의의 수의 람다를 취하고 모든 호출 연산자의 중앙 호출 지점 역할을하는 구조체를 갖고 싶습니다.

호출 연산자가 생성시 제공된 람다와 일치하지 않는 인수 목록을 사용하여 호출되는 경우 기본 호출 연산자를 호출해야합니다.

다음 코드가 정확히 이것을 수행 할 것이라고 생각했습니다. 모든 람다에 대한 호출 연산자는를 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 ++ , ClangGCC (모두 최신 버전)에서 테스트했습니다 .

편집하다:


그것을 발견하면 간단합니다. 연산자는 const정규화 되지 않은 반면 람다의 것은 (람다를로 정의하지 않는 한 mutable)입니다. 따라서 상수가 아닌 인스턴스와 더 잘 일치합니다 Poc.

누락 된 부분 만 추가하세요 const.

auto operator() (Ts...) const

참조 URL : https://stackoverflow.com/questions/53173336/overload-resolution-for-inherited-functions

반응형