수치실험 코드를 짜고 있는데,
같은 실험을 몇백만번 돌려서 평균내고 그래프 그리고 그런걸 한단 말이야?
원래는 파이썬으로 대~충 짜서 적당히 돌렸는데,
이번에 하는건 그렇게 하니까 속도가 너무 안나와서 아예 c++ (STL쓰는 c언어....) 로 처음부터 다시 짜고있음
어떤 함수 func1() 을 백만번 돌리고,
그 안에 func2, func3, func4 ... 가 있는데,
이 func2 같은것들의 종류를 다르게 했을때 얻어지는 효과를 알고싶은거거든
예를들어서, func2가 문제의 초기값을 정해주는 함수고,
func2에 파라메터 "A"가 입력되면 방법 A가, "B"가 입력되면 방법 B가 실행되는 식으로 구현했음.
실제로는
(적절한 반환 자료형) func2Router(string METHOD, 기타 파라메터) {
switch(METHOD){ // switch에 텍스트 쓰게하는건 해쉬함수로 적절히 구현
case METHOD == "A" :
return func2A(기타 파라메터);
break;
case METHON == "B" :
return func2B(기타 파라메터);
break;
이하생략
}
이런식으로 매번 main함수에서 func2가 실행되어야하는 자리에
func2의 종류를 의미하는 스트링 METHOD를 입력받는 라우터함수를 한번 거쳐서
실제로 내가 실행하고 싶은 진짜 func2가 실행되도록 했는데,
이게 관리도 힘들고 어짜피 메인함수에 해당하는 func1()에서는 모든 func2()가 같은 METHOD를 사용하거든
그니까 이 라우터함수는 func2를 사용할때마다 매번 호출될 필요가 없고,
가장 밖에 있는 main함수에서 한번만 func2를 설정해서 그 뒤로 그걸 사용하면 되는거잖아??
내가 아는 짧은 c 지식으로는
이걸 가능하게 해주는 방법이 함수 포인터라고 알고 있음
즉, main함수에서
void (*func2) (func2들이 받을법한 모든 파라메터들)
이라고 선언하고,
위에 있는 func2Router를 매번 실행시키는 대신에
void func2Router (void (*f2p), string METHOD){
switch(METHOD){ // switch에 텍스트 쓰게하는건 해쉬함수로 적절히 구현
case METHOD == "A" :
f2p = func2A;
break;
case METHON == "B" :
f2p = func2B;
break;
이하생략
return 0;
}
void main(){
string METHOD = "A";
void (*func2) (파라매터 들);
func2Router(func2);
생략
return 0
}
이런식으로 해주면 앞으로 func2를 사용할때마다 func2A가 호출되는건가?
이런거 말고 virtual함수라는것도 있다고 들었는데
그냥 함수포인터 쓰면 똑같은거 할수 있는거임????
사실 맨위에 있는 스위치로 분기해주는것도 작동에는 문제가 없는데,
속도랑 관리면에서 영 좋은방법이 아닌것같아서;;
네가 말하는걸 리플렉션이라고 하는데 c++은 강한 정적 타입 언어라 정석적으로 구현하기 힘듬 ㅇㅅㅇㅋㅋㅋ
일반 함수는 void(*)로 타입 뭉갤 수 있을텐데 호출할 때, 타입 캐스팅 다시 해야 하고 암튼 족가틈 ㅇㅅㅇ
호출할 함수를 dll에 넣어 하는 방법이 그나마 정석적
메서드 시그니처가 몇 종류 안 된다면 같은 시그니처끼리 모아서 std::map 같은걸로 매핑하면 깔끔하게 될 듯. 여러 객체의 여러 파라매터를 받는걸 하나로 모으는건 힘듬 ㅇㅅㅇ
c++은 똥이야 우헤헿 ㅇㅅㅇㅋㅋㅋ
생각해보니 니가 구현하는거면 시그니처 통일할 수 있겠네. 파라메터를 객체로 만들고 상속 시켜서 네가 말한 virtual로 메서드 동적 바인딩으로 가져오도록해서 시그니처만 통일하면 해시 테이블로 매핑 깔끔하게 될 듯 ㅇㅅㅇ
func2들의 입출력 양식(자료형)은 전부 동일하고 내부 처리과정이 다른건데, 그러면 함수포인터로 하는게 나을라나? 어쩌다보니까 파이썬이랑 포트란을 위주로 프로그래밍 하게되어서 c나 c++는 겉햛기로만 아는수준임 ㅠㅠ
그럼 객체지향에 집착하지 말고 그냥 함수 포인터로 해 ㅇㅅㅇㅋㅋㅋ
std::function에 담으면 깔끔하게 될거임
감사합니다 형님
일단 virtual이란 녀석은 클래스와 클래스간의 상속관련해서 사용되는 녀석이고
해결법은 위에 빡고수가 나타나서 본인은 빠지겠음
너무 쓸데없이 빙빙 둘러가는거 같은데 - dc App
환경세팅이 어떤진 모르겠지만 터미널이면 main문 ac av 받게 세팅하고 실행시킬 때 인자 주는걸로 변수 초기화해서 활용하면 충분할거 같은데 - dc App
가상함수는 여기에 해당하는 해결책은 아니고 함수 오버로딩, 함수포인터, 비트 논리연산 정도 써볼 수 있는데 제일 빠른건 비트 논리연산일듯 - dc App