문제

변수가 다른 기능에 의존하는 일부 개체가 있습니다.다른 말로 표현하자면:개체의 변수가 의존하는 여러 유형의 함수가 있지만 이러한 기능이 동일한 개체도 여러 개 있어야 합니다.더 많은 정리를 위해 예를 들어 보았습니다(작동하지 않음).

#include <iostream>

class A
{
  double size;

  A( double (*f)() )
  {
    size = (*f)();
  };
};

double fun1()
{
  return 42.0;
}


int main()
{
  A a = A( &fun1() );

  std::cout << a.size << std::endl;
}

물론 이것은 최소한의 예이다.변수 크기는 클래스에 인수로 전달되어야 하는 특정 함수에 따라 달라집니다.상상하다 fun1 그리고 fun2 다양한 종류의 난수 생성기로 사용됩니다.

내 생각에 C++의 이념적 방식은 변수를 보유하는 클래스이고 그로부터 상속된 클래스는 객체와 다른 함수에 의해 수정됩니다(이 가정이 틀렸다면 정정해 주세요).하지만 내 질문은 다음과 같습니다.

일종의 고차 생성자를 구현할 가능성이 있습니까?그렇다면 예가 좋을 것입니다.

추신.:기술적인 용어를 잘못 사용한 경우 기꺼이 수정해 드리겠습니다.

도움이 되었습니까?

해결책

로 변경:

A( double (*f)() )
{
    size = f();
};

그리고:

A a = A( fun1 );

당신이 지나갈 때 &fun1() 그것은 함수를 호출하고 결과의 주소를 취하려고했습니다. 실제로 원했던 것은 기능 포인터 자체가 저장된 것입니다. fun1.

다른 팁

이 예제는 나중에 사용하기 위해 기능 포인터를 저장하지 않기 때문에 의미가 없습니다. 단순히 이것을 단순히 다시 작성할 수 있습니다

class A
{
    double size;

    A(double sz) {
        size = sz;
    };
};

double fun1()
{
    return 42.0;
}


int main()
{
    A a = A(fun1());
    std::cout << a.size << std::endl;
}

대신에 함수 포인터나 함수 객체를 전달할 수 있도록 템플릿을 작성하는 것이 좋습니다.이를 통해 컴파일러는 많은 경우에 인라인과 같은 최적화를 더 쉽게 수행할 수 있으며 더 유연합니다.또한 함수 포인터를 가져올 때 괄호를 사용하면 안 됩니다.

#include <iostream>

class A {
public:
    template<typename F>
    explicit A(F&& f) : size(f()) {

    };

    double size;
};

double fun1() {
    return 42.0;
}

int main() {
    A a(&fun1);
    std::cout << a.size << std::endl;
}

기능 자체 만 전달 해야하는 것 같습니다. 당신은 거의 그것을 얻었습니다. 올바른 구문은 다음과 같습니다.

typedef double (*functype)();

void foo(functype f) {
    cout << f();
}

double bar() {
    return 2.39;
)

foo(bar); // don't call bar here, just pass it as address.

Foo를 다음과 같이 선언 할 수도 있습니다.

void foo(double (*f)());

함수는 C ++의 일류 객체가 아니므로 일부 변수로 클로저를 생성하는 유일한 방법 (예 : 함수를 전달하거나 비 정적 멤버 함수를 호출하려는 경우)은 functors (오버로드 된 연산자가있는 개체 () ). 그러한 대상을 얻는 방법에는 여러 가지가 있습니다.

  1. 직접 정의하고 필요한 모든 변수를 필드에 저장하고 기능의 인수로 전달하십시오.
  2. C ++ 11의 Lambda Functions 및 STD :: 기능 사용
  3. boost :: function and boost :: bind를 사용하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top