템플릿 매개 변수로 사용할 멤버 함수 포인터를 저장 / 검색하는 방법은 무엇입니까?

로스 벤시나

메타 프로그래밍을 위해 멤버 함수 포인터를 형식에 저장하고 나중에이를 사용하여 템플릿을 매개 변수화하고 싶습니다.

비유하면 다음은 integer_constant유형에 int를 저장하는 방법에 대한 작업 예제입니다 .

template< int I >
struct integer_constant {
    static constexpr int value = I;  
};

template <int I>
struct A {
    // (client type, probably does other things with I)
    static constexpr int value = I;   
};

namespace {
    using cStored= integer_constant<42>; // store value
    static_assert(cStored::value == 42, "");

    // ...

    using aUseStored = A<cStored::value>; // use value as template parameter
    static_assert(aUseStored::value == 42, "");
}

멤버 함수 포인터로 같은 일을 할 수 있습니까? 그렇지 않다면 왜 안됩니까?

struct S{
    void foo() {}
};

typedef void (S::*s_member_fn_type)();

template< s_member_fn_type M >
struct member_fn_constant {
    static constexpr s_member_fn_type value = M;  
};

template <s_member_fn_type M>
struct A {
    // (client type, probably does other things with M)
    static constexpr s_member_fn_type value = M;   
};

namespace {
    using cStored = member_fn_constant<&S::foo>; // store value

    // clang is ok with the following line
    // gcc 6.2: error: non-constant condition for static assertion
    // gcc 6.2: error: '(s_member_fn_type)member_fn_constant<&S::foo>::value' is not a constant expression
    static_assert(cStored::value == &S::foo, "");

    // following line gives:
    // clang 3.9.0 error: non-type template argument is not a pointer to member constant
    // gcc 6.2: error: could not convert template argument 'member_fn_constant<&S::foo>::value' to 'void (S::*)()'
    using aUseStored  = A<cStored::value>; // use value as template parameter
    //static_assert(aUseStored ::value == &S::foo, "");
}

다음과 같이 함수 포인터 대신 래퍼 구조체를 전달하여 간접 수준을 추가 할 수 있음을 이해합니다.

template <typename MT>
struct B {
    static constexpr s_member_fn_type value = MT::value;   
};

namespace {
    using bUseStored  = B<cStored>;
}

그러나 내 클라이언트 클래스 A가 이미 멤버 함수 포인터를 사용하도록 정의 된 경우 도움이되지 않습니다 .

이름

C ++ 17 이전 버전에서는 멤버 함수에 대한 포인터가 상수식이 아닙니다.

C ++ 17에서 N4268에 의해 해결 된 상수 표현식 입니다.

Clang에서 C ++ 지원을-std=c++1z 볼 수 있듯이 clang은 clang 3.5에서 지원했습니다.

g ++는 g ++ 6에서 지원했다고 주장했지만 사실이 아닌 것 같습니다 . GCC의 C ++ 표준 지원을 참조하세요.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

일반 함수 포인터를 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

분류에서Dev

템플릿 후크에서 클로저 매개 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

템플릿 함수가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

멤버 매개 변수에 대한 포인터가있는 템플릿 클래스를 전문화하는 방법은 무엇입니까?

분류에서Dev

템플릿 인수 및 매개 변수 팩과 함께 enable if를 사용하는 방법은 무엇입니까?

분류에서Dev

함수 포인터를 매개 변수로 사용하여 템플릿의 정적 멤버를 초기화하는 방법

분류에서Dev

템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

분류에서Dev

std :: bind에서 템플릿 함수 매개 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

템플릿 클래스가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

가변 매개 변수를 템플릿 매개 변수로 사용하여 멤버 함수를 작성하는 방법

분류에서Dev

템플릿을 사용하여 멤버 함수를 선언하는 방법은 무엇입니까? (템플릿 클래스가 아님)

분류에서Dev

함수 인수를 나타내지 않는 매개 변수 팩을 확장하는 함수 템플릿을 만드는 방법은 무엇입니까?

분류에서Dev

4 개의 값 2 개의 변수로 멤버 함수를 사용하는 방법은 무엇입니까?

분류에서Dev

C ++ : 가변 템플릿 인수에서 유형 매개 변수를 사용하여 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 매개 변수에 사용할 매개 변수로 데이터 멤버 이름을 전달하는 방법은 무엇입니까?

분류에서Dev

동일한 멤버 변수에 다른 특수 템플릿 클래스를 저장하는 방법은 무엇입니까?

분류에서Dev

함수 포인터를 템플릿 함수 유형 매개 변수로 사용 하시겠습니까?

분류에서Dev

유형이 아닌 매개 변수가있는 C ++ 템플릿 클래스 : 할당 연산자를 오버로드하는 방법은 무엇입니까?

분류에서Dev

PHP의 mysqli 저장 프로 시저에서 매개 변수를 검색하는 방법은 무엇입니까?

분류에서Dev

기본 템플릿 매개 변수 / 인수를 사용하는 다음 템플릿 함수와의 차이점은 무엇입니까?

분류에서Dev

템플릿 멤버 함수의 특수 변형에 대한 포인터를 만드는 방법은 무엇입니까?

분류에서Dev

두 개의 템플릿 템플릿 매개 변수로 공유 템플릿 변수를 지정하는 방법은 무엇입니까?

분류에서Dev

친구 함수에 대한 포인터를 멤버 함수의 매개 변수로 사용하는 방법

분류에서Dev

C ++ : 가변 템플릿이있는 멤버 함수 포인터 매개 변수

분류에서Dev

템플릿 화 된 constexpr 멤버 함수로 constexpr std :: array를 초기화하는 방법은 무엇입니까?

분류에서Dev

멤버 함수 템플릿의 인스턴스화를 삭제하는 방법은 무엇입니까?

분류에서Dev

비 정적 멤버 함수를 템플릿 인수로 다른 멤버 함수에 전달하는 방법은 무엇입니까?

분류에서Dev

Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

분류에서Dev

Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

Related 관련 기사

  1. 1

    일반 함수 포인터를 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

  2. 2

    템플릿 후크에서 클로저 매개 변수를 사용하는 방법은 무엇입니까?

  3. 3

    템플릿 함수가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

  4. 4

    멤버 매개 변수에 대한 포인터가있는 템플릿 클래스를 전문화하는 방법은 무엇입니까?

  5. 5

    템플릿 인수 및 매개 변수 팩과 함께 enable if를 사용하는 방법은 무엇입니까?

  6. 6

    함수 포인터를 매개 변수로 사용하여 템플릿의 정적 멤버를 초기화하는 방법

  7. 7

    템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

  8. 8

    std :: bind에서 템플릿 함수 매개 변수를 사용하는 방법은 무엇입니까?

  9. 9

    템플릿 클래스가 매개 변수 팩을 사용할 때 다른 템플릿 매개 변수를 전달하는 방법은 무엇입니까?

  10. 10

    가변 매개 변수를 템플릿 매개 변수로 사용하여 멤버 함수를 작성하는 방법

  11. 11

    템플릿을 사용하여 멤버 함수를 선언하는 방법은 무엇입니까? (템플릿 클래스가 아님)

  12. 12

    함수 인수를 나타내지 않는 매개 변수 팩을 확장하는 함수 템플릿을 만드는 방법은 무엇입니까?

  13. 13

    4 개의 값 2 개의 변수로 멤버 함수를 사용하는 방법은 무엇입니까?

  14. 14

    C ++ : 가변 템플릿 인수에서 유형 매개 변수를 사용하여 함수를 호출하는 방법은 무엇입니까?

  15. 15

    다른 매개 변수에 사용할 매개 변수로 데이터 멤버 이름을 전달하는 방법은 무엇입니까?

  16. 16

    동일한 멤버 변수에 다른 특수 템플릿 클래스를 저장하는 방법은 무엇입니까?

  17. 17

    함수 포인터를 템플릿 함수 유형 매개 변수로 사용 하시겠습니까?

  18. 18

    유형이 아닌 매개 변수가있는 C ++ 템플릿 클래스 : 할당 연산자를 오버로드하는 방법은 무엇입니까?

  19. 19

    PHP의 mysqli 저장 프로 시저에서 매개 변수를 검색하는 방법은 무엇입니까?

  20. 20

    기본 템플릿 매개 변수 / 인수를 사용하는 다음 템플릿 함수와의 차이점은 무엇입니까?

  21. 21

    템플릿 멤버 함수의 특수 변형에 대한 포인터를 만드는 방법은 무엇입니까?

  22. 22

    두 개의 템플릿 템플릿 매개 변수로 공유 템플릿 변수를 지정하는 방법은 무엇입니까?

  23. 23

    친구 함수에 대한 포인터를 멤버 함수의 매개 변수로 사용하는 방법

  24. 24

    C ++ : 가변 템플릿이있는 멤버 함수 포인터 매개 변수

  25. 25

    템플릿 화 된 constexpr 멤버 함수로 constexpr std :: array를 초기화하는 방법은 무엇입니까?

  26. 26

    멤버 함수 템플릿의 인스턴스화를 삭제하는 방법은 무엇입니까?

  27. 27

    비 정적 멤버 함수를 템플릿 인수로 다른 멤버 함수에 전달하는 방법은 무엇입니까?

  28. 28

    Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

  29. 29

    Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

뜨겁다태그

보관