c++
generic과 같은 함수를 구현하고 싶습니다. 정수와 별개로 매개 변수는 문자 유형 및 기타 유형도 지원해야합니다.C++ 함수와 비슷한 C 함수
void function t(int a[],int len);
C 언어로 구현하는 방법은 무엇입니까?
c++
generic과 같은 함수를 구현하고 싶습니다. 정수와 별개로 매개 변수는 문자 유형 및 기타 유형도 지원해야합니다.C++ 함수와 비슷한 C 함수
void function t(int a[],int len);
C 언어로 구현하는 방법은 무엇입니까?
C에서 이것을 수행하는 관용적 인 방법은 void *를 전달하는 것입니다. 그러나 실제로 그걸로 무엇이든 할 수있는 추가 정보가 필요합니다.
당신은 몇 가지 다른 옵션, 적합 손에 작업에 따라 수 있습니다 ++은 C를처럼 당신은 C에서 템플릿을 가지고 있지 않기 때문에 :
사전 프로세서를 사용하고를 만드는을 <
및 >
조작을 단순히 랩핑하는 기본 매크로 MIN
/MAX
과 같은 기본 매크로를 사용하십시오.
다른 특정 데이터 유형에 대한 기능의 버전 작성 - 등 function_int(int...)
, function_char(char...)
,
구현 세부 사항을 모르고하는 void*
으로 데이터에 걸리는 일반적인 기능을 작성하고, 함수 포인터를하는 데이터에 작용하고이 데이터를 조작하는 방법을 알고있는 함수에 의해 호출됩니다. 이 경우
void *
의 아르 bsearch
같은 기능을보고하고, 비교 기능은 특정 타입의 데이터에 대해 전달된다가 void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
비교 함수 인 데이터의 유형을 알아야하는 유일한 코드이므로 함수의 일반 부분을 한 번만 작성하면됩니다. 그러나 위의 경우와 같이 조작 할 각 데이터 유형에 대한 함수를 작성해야합니다.
이것은 C Unleashed 책에서 설명한 기술이라고 생각됩니다. 이 책은 아마도 내가 기억에서 재현 할 수있는 것보다 조금 더 우아 할 것입니다.
/* function.tmpl */
#ifndef FUNCTION
#define FUNCTION_PASTE(X,Y) X ## _ ## Y
#define FUNCTION(X) FUNCTION_PASTE(function, X)
#endif
void FUNCTION(TYPE) (TYPE a[], int len) {
/* do something */
}
그런 다음이처럼를 포함 할 수 있습니다 :
#define TYPE int
#include "function.tmpl"
#undef TYPE
#define TYPE double
#include "function.tmpl"
#undef TYPE
을 그리고 다음과 같이 함수를 호출 :
int a[4];
FUNCTION(int)(a, 4);
double b[5];
FUNCTION(double)(b, 5);
와우, 훌륭합니다. 나는 그걸 가지고 놀 것이다. 나는 typeof (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html) 연산자가 여기에서 매우 유용 할 수 있다고 생각한다. – Jack
typeof 주석을 무시하십시오. 예상대로 작동하지 않습니다.이 연산자는 할당하는 것으로 만 제한됩니다.'typeof (a) foo = ..; ' – Jack
@Jack : 직접 생각하지 않았습니다. 그것은 내가 오래 전에 썼던 책에 설명되어 있습니다. 나는 책 제목으로 대답을 업데이트했다. 나를 상기시켜 줘서 고마워. 문안 인사 – jxh
당신은 수를
당신은이 같은 파일을 포함 할 수 있습니다 다음과 같이 시도하십시오.
enum data_type { CHAR_TYPE, INT_TYPE };
void function t(void* buf, size_t len, enum data_type type) {
int* int_ary;
char* char_ary;
if (type == CHAR_TYPE) {
char_ary* = buf;
...
} else if (type == INT_TYPE) {
int_ary* = buf;
...
}
}
hackish이고 오류가 발생하기 쉽지만 작동 할 수 있습니다. C++과 완전히 똑같지는 않습니다. 각 유형에 대해 별도의 버전이 아니라 하나의 통합 된 기능입니다.
C++에는 템플릿이 있습니다. C에서 매크로에 가장 가까운 것은 ... eek입니다. – Mysticial
C에는 템플릿이 없습니다. 이 기능이 특히 원하는 기능은 무엇입니까? 구체적인 예를 포함하도록 질문을 편집하십시오. –
'void *'는 당신이 사용해야하는 것입니다. 그리고 똑똑한 (그러나 신중한) 프로그래밍의 한 마디. –