문제

이것 기사 C#에서 A + 연산자가 정의 된 임의의 값 유형을 추가 할 수있는 방법을 설명합니다. 본질적으로 다음 코드를 허용합니다.

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은 a 유틸리티 라이브러리 운영자 문제를 매우 우아하게 해결합니다.

도움이 되었습니까?

해결책

템플릿이 C ++로 컴파일되는 방식으로 인해 간단히 수행합니다.

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

작동하면 연산자+가 정의되지 않은 모든 유형에 대해 컴파일 오류가 발생합니다.

C ++ 템플릿은 모든 유형 인스턴스화에 대한 코드를 생성하므로 모든 유형 T 코드가 올바른 일을하는 모든 유형 T 코드가 생성됩니다. 이런 식으로 C ++는 NUM <> Trickery가 필요하지 않습니다.

일반 C에서는 이것이 내가 아는 한 불가능합니다.

다른 팁

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

이것은 템플릿을 사용하여 C ++에서 쉽게 수행 할 수 있습니다.


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

그러나 이것을 주목하십시오 ~ 해야 하다 헤더 파일에 정의되면 값 대신 Const 참조별로 매개 변수를 전달하려고합니다.

이것은 일반 C에서 전혀 할 수 없습니다.

매크로로 문제 요구 사항을 충족하는지 확실하지 않지만 C에서도 수행 할 수 있습니다.

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

C ++의 템플릿. C에서는 거대한 번거 로움과 오버 헤드가 없습니다.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top