로 변경:
A( double (*f)() )
{
size = f();
};
그리고:
A a = A( fun1 );
당신이 지나갈 때 &fun1()
그것은 함수를 호출하고 결과의 주소를 취하려고했습니다. 실제로 원했던 것은 기능 포인터 자체가 저장된 것입니다. fun1
.
문제
변수가 다른 기능에 의존하는 일부 개체가 있습니다.다른 말로 표현하자면:개체의 변수가 의존하는 여러 유형의 함수가 있지만 이러한 기능이 동일한 개체도 여러 개 있어야 합니다.더 많은 정리를 위해 예를 들어 보았습니다(작동하지 않음).
#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 (오버로드 된 연산자가있는 개체 () ). 그러한 대상을 얻는 방법에는 여러 가지가 있습니다.