2008-10-21 9 views
5

article은 C#에서 + 연산자가 정의 된 임의의 값 형식을 추가 할 수있는 방법을 설명합니다. 본질적으로 다음과 같은 코드를 할 수 있습니다 :임의의 값 형식에 대한 연산

public T Add(T val1, T val2) 
{ 
    return val1 + val2; 
} 

거기에 T 유형이 '+'연산자에 대한 정의가된다는 보장은 없지만, 효과는 다음과 같은 코드로 달성 될 때이 코드는 컴파일되지 않습니다 :

public T Add(T val1, T val2) 
{ 
    //Num<T> defines a '+' operation which returns a value of type T 
    return (new Num<T>(val1) + new Num<T>(val2)); 
} 

Num 클래스가이를 어떻게 달성하는지 보려면 링크를 클릭하십시오. 어쨌든, 질문에. C 또는 C++에서 동일한 효과를 얻을 수있는 방법이 있습니까? 호기심에 대한, 내가 해결하려고하는 문제는 CUDA 커널이 더 많은 유형에서 작동하도록함으로써 더 유연하거나 일반적이되도록 허용하는 것입니다.

업데이트 : .NET의 경우 Marc Gravell이 연산자 문제를 매우 우아하게 해결하는 utility library을 만들었습니다. 방식으로 인해 템플릿

답변

13

간단하고, C++에서 컴파일 :

template < class T > 
T add(T const & val1, T const & val2) 
{ 
    return val1 + val2; 
} 

는 운영자 +가 정의되지 않은 모든 유형에 대한 컴파일 오류가 발생합니다 작동합니다.

C++ 템플릿은 모든 유형의 인스턴스화에 대한 코드를 생성하므로 올바른 형식을 나타내는 모든 유형의 T 코드가 생성됩니다. 이 방법으로 C++에는 Num <> 속임수가 필요하지 않습니다.

보통 C에서 이것은 내가 아는 한 불가능합니다.

+1

주목할 가치가있는 점은 C++ 템플릿과 함께 작동하는 방식이 'duck typing'형식으로 지정되었습니다. 기본적으로 당신은 실제로 원하는 타입에서 벗어나 '대신 메소드와 오퍼레이션 X, Y 등을 지원해야합니다'라고 말합니다. 루비의 기본 유형 메커니즘으로도 사용됩니다. – workmad3

1

이 쉽게 ++ C에서 수행 할 수 있습니다 사용하여 템플릿 : 그러나


template <typename T> 
T Add(T val1, T val2) 
{ 
    return val1 + val2; 
}

주,이 헤더 파일에 정의해야합니다, 당신은 아마 대신 const를 참조로 매개 변수를 전달하려는 가치의.

이것은 전혀 C로 수행 할 수 없습니다.

4

이것은 단순히 문제가되지 않습니다. 첫 번째 샘플 코드는 C++ (ETA : Pieter가 그렇듯이)로 변환하면 작동하지만 직접 +를 사용하지 않는 상황은 생각할 수 없습니다. 존재하지 않는 문제에 대한 해결책을 찾고 있습니다.

0

C++의 템플릿. C에서 많은 번거 로움과 오버 헤드가 발생하지 않습니다.

template<typename T> 
T add(T x, T y) 
{ 
    return x + y; 
} 
1

매크로를 사용하여 문제 요구 사항을 충족하는지 잘 모르겠지만 C로도 수행 할 수 있습니다.

#define ADD(A,B) (A+B) 
+0

아니요 !!!! 그러지 마. #define SQUARE (A) (A)) #define SQUARE (A) (A * A)는 SQUARE (x + y)에 대해 매우 다른 결과를 줄 것입니다. –