2012-07-11 3 views
2

c++ generic과 같은 함수를 구현하고 싶습니다. 정수와 별개로 매개 변수는 문자 유형 및 기타 유형도 지원해야합니다.C++ 함수와 비슷한 C 함수

void function t(int a[],int len); 

C 언어로 구현하는 방법은 무엇입니까?

+2

C++에는 템플릿이 있습니다. C에서 매크로에 가장 가까운 것은 ... eek입니다. – Mysticial

+1

C에는 템플릿이 없습니다. 이 기능이 특히 원하는 기능은 무엇입니까? 구체적인 예를 포함하도록 질문을 편집하십시오. –

+0

'void *'는 당신이 사용해야하는 것입니다. 그리고 똑똑한 (그러나 신중한) 프로그래밍의 한 마디. –

답변

0

C에서 이것을 수행하는 관용적 인 방법은 void *를 전달하는 것입니다. 그러나 실제로 그걸로 무엇이든 할 수있는 추가 정보가 필요합니다.

3

당신은 몇 가지 다른 옵션, 적합 손에 작업에 따라 수 있습니다 ++은 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 *)); 
    

    비교 함수 인 데이터의 유형을 알아야하는 유일한 코드이므로 함수의 일반 부분을 한 번만 작성하면됩니다. 그러나 위의 경우와 같이 조작 할 각 데이터 유형에 대한 함수를 작성해야합니다.

2

이것은 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); 
+0

와우, 훌륭합니다. 나는 그걸 가지고 놀 것이다. 나는 typeof (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html) 연산자가 여기에서 매우 유용 할 수 있다고 생각한다. – Jack

+0

typeof 주석을 무시하십시오. 예상대로 작동하지 않습니다.이 연산자는 할당하는 것으로 만 제한됩니다.'typeof (a) foo = ..; ' – Jack

+0

@Jack : 직접 생각하지 않았습니다. 그것은 내가 오래 전에 썼던 책에 설명되어 있습니다. 나는 책 제목으로 대답을 업데이트했다. 나를 상기시켜 줘서 고마워. 문안 인사 – jxh

0

당신은 수를

당신은이 같은 파일을 포함 할 수 있습니다 다음과 같이 시도하십시오.

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++과 완전히 똑같지는 않습니다. 각 유형에 대해 별도의 버전이 아니라 하나의 통합 된 기능입니다.