컴파일 타임에 클래스에 상속 된 함수가 있는지 확인하는 방법은 무엇입니까?

xmllmx
#include <vector>
#include <iostream>
#include <type_traits>

using namespace std;

template<typename Coll>
class has_push_back
{
    using coll_type = decay_t<Coll>;
    using True = char(&)[1];
    using False = char(&)[2];

    template<typename U, void(U::*)(const typename U::value_type&)>
    struct SFINAE {};

    template<typename T>
    static True Test(SFINAE<T, &T::push_back>*);

    template<typename T>
    static False Test(...);

public:
    enum { value = sizeof(Test<coll_type>(nullptr)) == sizeof(True) };
};

class MyColl : public vector<int> {};

int main()
{
    cout << has_push_back<vector<int>>::value << endl;
    cout << has_push_back<MyColl>::value << endl;
}

위의 프로그램은 다음을 출력합니다.

1
0

has_push_back함수 push_back가 상속 되면 템플릿 이 작동하지 않음을 보여줍니다 .

상속 되어도 작동하도록하는 방법이 있습니까?

Skypjack

완전성을 위해 이전에 언급하지 않은 다른 접근 방식을 게시하고 싶습니다.
이것은 함수의 정의와 별칭 선언을 기반으로합니다.
최소한의 작동 예제를 따릅니다.

#include <vector>
#include <type_traits>
#include<utility>

using namespace std;

template<typename T, typename... U>
constexpr auto f(int)
-> std::conditional_t<false, decltype(std::declval<T>().push_back(std::declval<U>()...)), std::true_type>;

template<typename, typename...>
constexpr std::false_type f(char);

template<typename T, typename... U>
using has_push_back = decltype(f<T, U...>(0));

class MyColl : public vector<int> {};

int main() {
    static_assert(has_push_back<vector<int>, int>::value, "!");
    static_assert(has_push_back<MyColl, int>::value, "!");
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

데이터 기반 함수로 클래스를 확장하고 컴파일 타임에 확인하는 방법은 무엇입니까?

분류에서Dev

D에서 컴파일 타임에 클래스 변수를 설정하는 방법은 무엇입니까?

분류에서Dev

믹스 인의 대상 클래스가 메타 클래스에서 상속 된 경우 믹스 인을 타이핑하는 방법은 무엇입니까?

분류에서Dev

컴파일 타임에 두 개의 기본 클래스 중 하나만 상속하는 C ++ 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

컴파일 타임에 어떤 클래스가로드되는지 확인하는 방법은 무엇입니까?

분류에서Dev

클래스 내에서 컴파일 타임 상수에 따라 유형 별칭을 만드는 방법은 무엇입니까?

분류에서Dev

부모 클래스 함수에서 상속 된 객체를 사용하는 방법은 무엇입니까?

분류에서Dev

컴파일 타임에 감지 할 수있는 제한된 길이 범위로 GenericArray를 사용하는 방법은 무엇입니까?

분류에서Dev

매핑 된 수퍼 클래스에서 @Id를 상속하는 방법은 무엇입니까?

분류에서Dev

사용 된 콜백 함수가 Cordova에서 동일한 지 확인하는 방법은 무엇입니까?

분류에서Dev

컴파일 타임에 변수가 선언되었는지 확인하는 방법이 있습니까?

분류에서Dev

SSE가 활성화 된 상태에서 Linux 커널을 컴파일하는 방법은 무엇입니까?

분류에서Dev

추상 클래스에서 파생 된 인스턴스 변수에 주석을 추가하는 방법은 무엇입니까?

분류에서Dev

인라인 함수가 컴파일러에 의해 자동으로 일반 함수로 변환되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

OrientDB에서 Java API에서 한 클래스가 다른 클래스에서 상속되는지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

Python에서 상속 된 클래스에서 사용하는 클래스 변수에 액세스하는 방법은 무엇입니까?

분류에서Dev

셀 수식에 상수가 포함되어 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

기본 클래스의 친구 함수가 private 임에도 불구하고 파생 클래스의 재정의 된 가상 함수를 호출하는 방법은 무엇입니까? (C ++)

분류에서Dev

객체가 런타임에 특정 클래스에서 파생되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

가상 함수가 파생 클래스에서만 정의 된 데이터 형식을 받아들이도록 만드는 방법은 무엇입니까?

분류에서Dev

제공된 허용 값을 확인할 수있는 Java에서 일반 클래스를 디자인하는 방법은 무엇입니까?

분류에서Dev

컴파일러가 둘러싸는 클래스에 대한 포인터를 제공하도록 속이는 방법은 무엇입니까?

분류에서Dev

상속 된 멤버가 파생 클래스에서 액세스 할 수 없는지 확인하면서 공용 상속의 이점을 계속 유지하는 방법이 있습니까?

분류에서Dev

클래스가 다른 클래스에서 상속되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

파이썬에서이 클래스 상속을 수행하는 방법은 무엇입니까?

분류에서Dev

런타임 컴파일 된 C # 코드에서 "UnityEngine"을 사용하는 방법은 무엇입니까?

분류에서Dev

런타임에서 생성 된 Angular8 코드를 컴파일하는 방법은 무엇입니까?

분류에서Dev

지정된 .php 파일에 포함 된 코드를 확인하는 방법은 무엇입니까?

분류에서Dev

컴파일 타임에 ABI를 감지하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    데이터 기반 함수로 클래스를 확장하고 컴파일 타임에 확인하는 방법은 무엇입니까?

  2. 2

    D에서 컴파일 타임에 클래스 변수를 설정하는 방법은 무엇입니까?

  3. 3

    믹스 인의 대상 클래스가 메타 클래스에서 상속 된 경우 믹스 인을 타이핑하는 방법은 무엇입니까?

  4. 4

    컴파일 타임에 두 개의 기본 클래스 중 하나만 상속하는 C ++ 클래스를 만드는 방법은 무엇입니까?

  5. 5

    컴파일 타임에 어떤 클래스가로드되는지 확인하는 방법은 무엇입니까?

  6. 6

    클래스 내에서 컴파일 타임 상수에 따라 유형 별칭을 만드는 방법은 무엇입니까?

  7. 7

    부모 클래스 함수에서 상속 된 객체를 사용하는 방법은 무엇입니까?

  8. 8

    컴파일 타임에 감지 할 수있는 제한된 길이 범위로 GenericArray를 사용하는 방법은 무엇입니까?

  9. 9

    매핑 된 수퍼 클래스에서 @Id를 상속하는 방법은 무엇입니까?

  10. 10

    사용 된 콜백 함수가 Cordova에서 동일한 지 확인하는 방법은 무엇입니까?

  11. 11

    컴파일 타임에 변수가 선언되었는지 확인하는 방법이 있습니까?

  12. 12

    SSE가 활성화 된 상태에서 Linux 커널을 컴파일하는 방법은 무엇입니까?

  13. 13

    추상 클래스에서 파생 된 인스턴스 변수에 주석을 추가하는 방법은 무엇입니까?

  14. 14

    인라인 함수가 컴파일러에 의해 자동으로 일반 함수로 변환되었는지 확인하는 방법은 무엇입니까?

  15. 15

    OrientDB에서 Java API에서 한 클래스가 다른 클래스에서 상속되는지 여부를 확인하는 방법은 무엇입니까?

  16. 16

    Python에서 상속 된 클래스에서 사용하는 클래스 변수에 액세스하는 방법은 무엇입니까?

  17. 17

    셀 수식에 상수가 포함되어 있는지 확인하는 방법은 무엇입니까?

  18. 18

    기본 클래스의 친구 함수가 private 임에도 불구하고 파생 클래스의 재정의 된 가상 함수를 호출하는 방법은 무엇입니까? (C ++)

  19. 19

    객체가 런타임에 특정 클래스에서 파생되었는지 확인하는 방법은 무엇입니까?

  20. 20

    가상 함수가 파생 클래스에서만 정의 된 데이터 형식을 받아들이도록 만드는 방법은 무엇입니까?

  21. 21

    제공된 허용 값을 확인할 수있는 Java에서 일반 클래스를 디자인하는 방법은 무엇입니까?

  22. 22

    컴파일러가 둘러싸는 클래스에 대한 포인터를 제공하도록 속이는 방법은 무엇입니까?

  23. 23

    상속 된 멤버가 파생 클래스에서 액세스 할 수 없는지 확인하면서 공용 상속의 이점을 계속 유지하는 방법이 있습니까?

  24. 24

    클래스가 다른 클래스에서 상속되었는지 확인하는 방법은 무엇입니까?

  25. 25

    파이썬에서이 클래스 상속을 수행하는 방법은 무엇입니까?

  26. 26

    런타임 컴파일 된 C # 코드에서 "UnityEngine"을 사용하는 방법은 무엇입니까?

  27. 27

    런타임에서 생성 된 Angular8 코드를 컴파일하는 방법은 무엇입니까?

  28. 28

    지정된 .php 파일에 포함 된 코드를 확인하는 방법은 무엇입니까?

  29. 29

    컴파일 타임에 ABI를 감지하는 방법은 무엇입니까?

뜨겁다태그

보관