템플릿 클래스 / 구조체의 멤버 함수 주소를 함수 매개 변수로 전달

앤드류

내 목표는 동일한 요소를 가진 다른 컨테이너를 반환하지만 변환기 멤버 함수 주소를 전달하여 다른 유형으로 변환하는 사용자 지정 컨테이너 메서드를 가져 오는 것입니다. 아래의 int main () 예제는 가장 간단한 방법으로 설명합니다.

내 문제는 (가능한 경우) 이러한 함수 매개 변수의 적절한 선언을 파악할 수 없다는 것입니다.

추신 : MSVC 컴파일러를 사용하고 있습니다.

template<typename container_type>
struct Container
{

    ...

    template
       <typename convert_type = container_type,
        typename = std::enable_if<!std::is_fundamental<container_type>::value>::type,
        typename = std::enable_if<!std::is_pointer<container_type>::value>::type>
    Container<convert_type> apply(convert_type (const container_type::*function)() const) const
            // error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
            // note: see reference to class template instantiation 'Container<container_type>' being compiled
            // error C2091: function returns function
    {
        Container<convert_type> result();
        result.reserve(this->size());

        for (const auto& i : *this)
        {
            result.push_back(i.*function());
        }

        return result;
    }
}



int main()
{
    Container<std::string> c = { "a", "b", "c" };
    Container<const char*> a = c.apply(&std::string::c_str);
}
앤드류

그것을 알아 냈습니다.

R Sahu의 발언이 정확합니다! 그러나 세 번째 실수도 있으므로 완전히 다루기 위해 다른 답변을 추가해야합니다.

1) container_type 앞에 불필요한 const가 있습니다. 이것이 "오류 C2091 : 함수가 함수를 반환"하는 이유입니다.

2) 포인터에 의한 멤버 함수 호출 구문이 잘못되었습니다.

3) 예를 들어 Container <SomeClass *>를 만들면 apply () 메서드를 사용할 수 없을뿐만 아니라 SFINAE가 충분하지 않아 해당 코드가 컴파일되지 않습니다. 함수 포인터 유형도 템플릿 인수 여야합니다. 따라서 해당 함수 템플릿의 적절한 선언은 다음과 같아야합니다.

 template
   <typename convert_type,
    typename = std::enable_if<!std::is_fundamental<container_type>::value>::type,
    typename = std::enable_if<!std::is_pointer<container_type>::value>::type,
    typename func_type = convert_type (type::*)() const>
Container<convert_type> apply(func_type function) const
{
    ...
    result.push_back((i.*function)());
    ...
}

이제 작동합니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

템플릿 구조의 객체를 다른 템플릿 클래스의 멤버 함수로 전달

분류에서Dev

정적 멤버 함수를 템플릿 매개 변수로 전달

분류에서Dev

템플릿 클래스 참조를 C ++의 매개 변수로 전달

분류에서Dev

정수를 예상하는 템플릿 함수에 개체 멤버 전달

분류에서Dev

멤버 함수 주소를 다른 클래스의 함수로 전달

분류에서Dev

템플릿 전문화 정의에서 한 클래스의 멤버 typedef를 템플릿 매개 변수로 사용할 수 없습니다.

분류에서Dev

템플릿 클래스의 멤버 함수 전문화

분류에서Dev

SFINAE를 사용하여 함수 템플릿의 매개 변수로 구조체에 대한 참조 전달

분류에서Dev

클래스의 멤버 함수를 클래스 외부의 매개 변수에 전달

분류에서Dev

구조체 멤버를 C 함수에 매개 변수로 전달

분류에서Dev

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

분류에서Dev

템플릿 함수의 C ++ 템플릿 클래스 멤버

분류에서Dev

알 수없는 유형의 클래스 템플릿 매개 변수로 함수 전달

분류에서Dev

기본 클래스가 멤버 함수의 매개 변수 유형 인 경우 기본 클래스의 템플릿 인수를 지정해야합니까?

분류에서Dev

멤버 함수를 템플릿 함수로 전달

분류에서Dev

클래스 개체를 템플릿 함수에 전달합니다. C ++

분류에서Dev

함수 포인터를 클래스 템플릿 매개 변수로 어떻게 전달합니까?

분류에서Dev

클래스 멤버로서의 템플릿 인수 함수

분류에서Dev

모든 함수를 템플릿 매개 변수로 전달

분류에서Dev

템플릿 매개 변수의 멤버 함수 호출 결과

분류에서Dev

내 템플릿 생성자가 객체를 함수에 전달할 때 클래스를 매개 변수로 사용하지 않도록하는 방법

분류에서Dev

가변 클래스 템플릿의 멤버 템플릿 함수를 정의하는 방법

분류에서Dev

PARENT 클래스의 멤버 이름을 템플릿 인수로 전달

분류에서Dev

템플릿 클래스-멤버 함수 전문화

분류에서Dev

객체 / 클래스를 함수의 매개 변수로 전달하는 방법

분류에서Dev

템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법 (이미 지정됨)?

분류에서Dev

템플릿 클래스의 멤버 함수

분류에서Dev

정의 된 클래스를 템플릿 매개 변수 내부의 구조체로 선언

분류에서Dev

별도의 템플릿 멤버를 기반으로 클래스의 템플릿 멤버 함수의 반환 유형 변경

Related 관련 기사

  1. 1

    템플릿 구조의 객체를 다른 템플릿 클래스의 멤버 함수로 전달

  2. 2

    정적 멤버 함수를 템플릿 매개 변수로 전달

  3. 3

    템플릿 클래스 참조를 C ++의 매개 변수로 전달

  4. 4

    정수를 예상하는 템플릿 함수에 개체 멤버 전달

  5. 5

    멤버 함수 주소를 다른 클래스의 함수로 전달

  6. 6

    템플릿 전문화 정의에서 한 클래스의 멤버 typedef를 템플릿 매개 변수로 사용할 수 없습니다.

  7. 7

    템플릿 클래스의 멤버 함수 전문화

  8. 8

    SFINAE를 사용하여 함수 템플릿의 매개 변수로 구조체에 대한 참조 전달

  9. 9

    클래스의 멤버 함수를 클래스 외부의 매개 변수에 전달

  10. 10

    구조체 멤버를 C 함수에 매개 변수로 전달

  11. 11

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

  12. 12

    템플릿 함수의 C ++ 템플릿 클래스 멤버

  13. 13

    알 수없는 유형의 클래스 템플릿 매개 변수로 함수 전달

  14. 14

    기본 클래스가 멤버 함수의 매개 변수 유형 인 경우 기본 클래스의 템플릿 인수를 지정해야합니까?

  15. 15

    멤버 함수를 템플릿 함수로 전달

  16. 16

    클래스 개체를 템플릿 함수에 전달합니다. C ++

  17. 17

    함수 포인터를 클래스 템플릿 매개 변수로 어떻게 전달합니까?

  18. 18

    클래스 멤버로서의 템플릿 인수 함수

  19. 19

    모든 함수를 템플릿 매개 변수로 전달

  20. 20

    템플릿 매개 변수의 멤버 함수 호출 결과

  21. 21

    내 템플릿 생성자가 객체를 함수에 전달할 때 클래스를 매개 변수로 사용하지 않도록하는 방법

  22. 22

    가변 클래스 템플릿의 멤버 템플릿 함수를 정의하는 방법

  23. 23

    PARENT 클래스의 멤버 이름을 템플릿 인수로 전달

  24. 24

    템플릿 클래스-멤버 함수 전문화

  25. 25

    객체 / 클래스를 함수의 매개 변수로 전달하는 방법

  26. 26

    템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법 (이미 지정됨)?

  27. 27

    템플릿 클래스의 멤버 함수

  28. 28

    정의 된 클래스를 템플릿 매개 변수 내부의 구조체로 선언

  29. 29

    별도의 템플릿 멤버를 기반으로 클래스의 템플릿 멤버 함수의 반환 유형 변경

뜨겁다태그

보관